sedを練習してみた その1

文字列処理をコマンドで行うためにsedを練習してみた. とりあえず, テキストファイルから特定のサッフィクスではじまる行だけを取り出してきて, そのサフィックスを除いたものを出力してみる.

まずは特定の行を取り出すところ. grepで良いんじゃないかという気もするが練習.

$ sed -e '/^SUFFIX/!d' filename
$ grep '^SUFFIX' filename

sedはファイルから1行ずつパターンスペースと呼ばれる領域に読み込んできてそれに対して指定した処理を加えていく. そして最後にパターンスペースの内容を出力する. 出力を抑制したい場合は"-n"オプションを指定する.

ここではまず"/^SUFFIX/"を使ってアドレスの指定を行なう. ここで指定されたアドレスに対してだけ以降のコマンドが実行される. ただしここで言うコマンドとは続けてあらわれるものだけで, ";"や次の"-e"で指定されるコマンドには関係ない. こうした次のコマンドに影響を与えるためにはパターンスペース自体を変更しなければならない. sedでよく利用される置換コマンドは置換後にパターンスペースを上書きするため, 次のコマンドにも結果が引き継がれる.

正規表現は一般的なもので"/^SUFFIX/"は"^"で行頭をあらわして, 行頭に"SUFFIX"を含む行ということになる. このアドレス表示に続いて"!"でこのアドレス以外の行(アドレス)となる. ここまでがアドレスで次の"d"がコマンドでパターンスペースを削除して, ただちに次の処理を開始する. ようするにこれで"行頭にSUFFIXを含まない行を削除する"となる. "s/^SUFFIX//g"だと"SUFFIX"は消えるが処理は終了されないのでマッチしない行も出力されてしまう.

次にサフィックスを削除する. これは普通に置換で良い.

$ sed -e '/^SUFFIX/!d' -e 's/^SUFFIX//g' filename
$ sed -e '/^SUFFIX/!d;s/^SUFFIX//g' filename
$ grep '^SUFFIX' filename | sed -e 's/^SUFFIX//g'

これで特定のサフィックスではじまる行だけをサフィックスを削除して出力できる.

https://www.gnu.org/software/sed/manual/sed.html