読者です 読者をやめる 読者になる 読者になる

Tech Blog

Information Technology / Machine Learning / Data Analysis / Big Data / System Integration

sed 備忘録

Linux sed

sedとは

sedとは、Linux上のファイルに対して文字列の置換・挿入・削除を行うコマンド。
awkと比べて自由度は少ないが、置換・挿入・削除に関しては高速に処理できる。

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