2021-03-01
標準入力からデータを受け取って編集後の結果を標準出力に書き出します。
結果を残す場合は、リダイレクトさせます。
sed
につけた-e
というオプションは、その後の文字列が編集用のコマンドだということ
を表します。
s
は置き換え(substitute)の意味です。s/OldText/NewText/
と書くことで、
2つの文字列の左側の文字を右側の文字に置き換えます。
1行の中で見つけた文字列を全て置き換える場合には
s/OldText/NewText/g
と指定します。
-n
コマンドは指示した行のみ実行するように指定できます。
置き換えた行のみ表示する場合は以下のようになります。
出力結果⏬
sedコマンドのデリミタ/
は変更可能です。
s
の後の次の文字がデリミタとして認識される仕様となっており、
慣習的に/
が使われますが、%
や@
を使っても問題ありません。
文字列の変換
g
があれば、行の全てを対象(globallyの略)にします。
文字列の削除
何もない文字列に返還させると文字列を結果的に削除できます。
行頭の文字列を消す
行頭の文字が指定した文字列に一致すれば削除する例です。
行末の文字列を消す
文字列を追加する
nnnn
という文字列の後にAddText
という文字を追加します。
行の先頭に文字列を追加する
行末に文字列を追加する
ドットとアスタリスク
.
には任意の1文字の意味があります。シェルの特殊文字?
と似たような働きを持ちます。
行頭の3文字を削除しています。
*
は直前の文字が任意の個数連続した場合(0も含む)を表します。
a*
という指定は、a、aa、aaaaaなどaが任意の個数続く文字列を表します。
.*
を指定すると、任意の文字列を表します。
.*
は全ての文字列に当てはまるため、行を全て、abcd
に置き換えます。
文字列の切り詰め、切り取り
以下のファイルがあるとします。
e以降の5文字をABCに置き換えます。
sを含めsより前の文字を切り取り
全ての行をXYZに置き換えます。
カッコの中の文字を全て消去
id
コマンドから最初のuidを取り出す。
id
コマンドから最初のユーザー名を取り出す。
\1
は丸括弧で囲んだ部分を1つ目を取り出せる。
丸括弧は文字列として扱われないようにエスケープする。
ある文字の最初からn文字を切り取る
行頭FIRST番目からLEN文字分を切り取ります。
awkコマンドで行頭の文字を切り取る
sedコマンドでは以下のようになります。
大文字と小文字を入れ替える
アルファベットだけを変換し、数字やその他の文字は変換しません。
タブをスペースに変換
複数のスペースを1個のスペースに変換
ホワイトスペースを1個のスペースに変換
ホワイトスペースとはタブかスペースのことです。
タブやスペースが混在している場合に1個のスペースに変えるには以下のようにします。
鉤括弧でどちらかを表現できます。
行頭のホワイトスペースを削除
行末のホワイトスペースを削除
ダブルクォートで囲った場合は$
をエスケープします。
文字列指定による行の削除
Test
という文字列を削除する場合の例です。
grep -v
で該当する文字列を含んだ行を表示しないという意味になります。
そのため、以下でも同じことができます。
sedによる行の指定
何行目から何行目までを編集するといった指定も可能です。
2から3行目を書き換える場合は以下のように記述します。
指定されていない行については何もしません。
行の削除
1行目を削除する場合は以下のように書けます。
最終行を削除する場合は以下です。
指定した行だけを表示する
2行目から最終行までを表示しないようにするので、1行目を表示することになります。
1行目を表示する
最終行を表示する
1行目から2行目を表示する
コメント行の削除
以下のようなファイルがあるとして、
先頭に#
がある行を削除したい場合は、以下となります。
また、途中で#
が出てくる行のコメントも削除したければ以下で良さそうです。
#
以降の文字を空に置き換えます。
ただそれだけでは、# vvvvxxxx
の行が空行として残ってしまうため、
空行を削除しています。
キーワードによる行の指定
BeginとEndで囲まれた部分の行を表示するには、
行数指定すれば
削除する場合は、
と書けますが、
/StartingPattern/,/EndingPattern
というパターンを使い、
キーワードを使った行指定も可能です。
また、キーワードがキーワードの行のみ
のようになっている場合は、
とすることで、もし意図しないところにキーワード(ここではBegin、End)がある場合にも
対応できるため確実です。
ファイルを後ろから表示する
まず、grepコマンドに-nオプションを用いて、行番号をつけます。
その際に全ての文字列に一致する.*
を指定して、全ての行を出力します。
sortコマンドで逆の番号順に並べます。
最後に不要な番号とコロンを削除します。