sed 備忘録
sedを操作するために知っておくべき7のこと
sedを操作するために知っておくべき7のことを、順に列挙する。
今回は以下のtest.datを操作対象とする。
$ vi test.txt 1 tea Tea tea 2 coffee coffee Coffee 3 Water water water
その1:sedコマンドは"sed '(アドレス部)(コマンド部)' ファイル名"で実行する。
$ cat test.txt 1 tea Tea tea 2 coffee coffee Coffee 3 Water water water $ sed '2d' test.txt # 2行目を削除(delete)する 1 tea Tea tea 3 Water water water $ sed -e '2d' test.txt # -eをつけても同じ 1 tea Tea tea 3 Water water water $ vi test01.sed 2d $ sed -f test01.sed test.txt # ファイルから実行することもできる 1 tea Tea tea 3 Water water water
その2:パターンスペースを知る。
sedコマンドの内部では、各行でパターンスペースを用いて以下のように処理される。
1. ファイルから1行読み込んでパターンスペースに格納
2. アドレスにマッチしていれば、コマンドを実行
3. パターンスペースを表示
その3:アドレス部の指定方法を知る。
$ cat test.txt 1 tea Tea tea 2 coffee coffee Coffee 3 Water water water $ sed '2!d' test.txt # 2行目以外を削除 2 coffee coffee Coffee $ sed '1,2d' test.txt # 1~2行目を削除 3 Water water water $ sed '1~2d' test.txt # 1行目から2行間隔で削除 2 coffee coffee Coffee $ sed '$d' test.txt # 最終行を削除 1 tea Tea tea 2 coffee coffee Coffee $ sed '1d;3d' test.txt # 1行目を削除、3行目を削除 2 coffee coffee Coffee $ sed '/e$/d' test.txt # eで終了する(正規表現/e$/)行を削除 1 tea Tea tea 3 Water water water $ sed 'd' test.txt
その4:表示・挿入のコマンドを知る。
$ cat test.txt 1 tea Tea tea 2 coffee coffee Coffee 3 Water water water $ sed '2p' test.txt # 2行目を表示 1 tea Tea tea 2 coffee coffee Coffee 2 coffee coffee Coffee 3 Water water water $ sed -n '2p' test.txt # 2行目を表示し、パターンスペース表示を抑制 2 coffee coffee Coffee $ sed '2q' test.txt # 2行目でやめる 1 tea Tea tea 2 coffee coffee Coffee $ sed '2i\insert' test.txt # 2行目の前に\以下を挿入 1 tea Tea tea insert 2 coffee coffee Coffee 3 Water water water $ sed '2a\append' test.txt # 2行目の後に\以下を挿入 1 tea Tea tea 2 coffee coffee Coffee append 3 Water water water $ sed -e '1i\start' -e '$a\end' test.txt # 最初にstart, 最後にendを挿入 start 1 tea Tea tea 2 coffee coffee Coffee 3 Water water water end
その5:1文字置換のコマンドを知る。
$ cat test.txt 1 tea Tea tea 2 coffee coffee Coffee 3 Water water water $ sed 'y/c/C/' test.txt # cをCに置換 1 tea Tea tea 2 Coffee Coffee Coffee 3 Water water water $ sed 'y/cw/CW/' test.txt # cをCに、wをWに置換 1 tea Tea tea 2 Coffee Coffee Coffee 3 Water Water Water
その6:文字列置換のコマンドを知る。
$ cat test.txt 1 tea Tea tea 2 coffee coffee Coffee 3 Water water water $ sed 's/tea/Tea/' test.txt # teaをTeaに置換(行ごとに最初に出現したteaのみ置換) 1 Tea Tea tea 2 coffee coffee Coffee 3 Water water water $ sed 's/tea/Tea/g' test.txt # teaをTeaに置換(行ごとに全てのteaを置換) 1 Tea Tea Tea 2 coffee coffee Coffee 3 Water water water $ sed 's/tea/Tea/2' test.txt # teaをTeaに置換(行ごとに2番目に出現したteaを置換) 1 tea Tea Tea 2 coffee coffee Coffee 3 Water water water $ sed 's/tea/IceTea/ig' test.txt # teaをTeaに置換(大文字/小文字を区別せず全てのteaを置換) 1 IceTea IceTea IceTea 2 coffee coffee Coffee 3 Water water water $ sed 's/[0-3]/(&)/' test.txt # 0-3を()付きに置換 (1) tea Tea tea (2) coffee coffee Coffee (3) Water water water $ sed 's/\([0-3]\) \(.*\)/\2 \1/' test.txt # 0-3とそれに続く文字列を交換 tea Tea tea 1 coffee coffee Coffee 2 Water water water 3
その7:ホールドスペースを知る。
sedにはパターンスペースの他に、退避スペースとしてホールドスペースがある。
h: パターンスペース → ホールドスペースへコピー
g: ホールドスペース → パターンスペースへコピー
x: パターンスペース ←→ ホールドスペースを交換
$ vi test07.sed /tea/ { # teaに一致する行に対して h # パターンスペースからホールドスペースにコピー s/[1-3]/3/ # パターンスペースを置換 x # ホールドスペースとパターンスペースを交換 } /water/ { g # ホールドスペースからパターンスペースにコピー } $ sed -f test07.sed test.txt 1 tea Tea tea 2 coffee coffee Coffee 3 tea Tea tea