こんにちは、lisです!
Linuxのsedコマンドを使いたくなっても、すぐ使い方忘れるので備忘録記事です。
基本構文
それぞれ入力文字列内にあるすべてのxxx
をyyy
に置換します。
# パイプで使うとき $ cat ./hoge.txt | sed -e 's/xxx/yyy/g' > ./new.txt # ファイル名指定して使うとき $ sed -e 's/xxx/yyy/g' ./hoge.txt > ./new.txt # リダイレクトを使わずファイルを書き換える(複数可) $ sed -i -e 's/xxx/yyy/g' ./hoge.txt $ sed -i -e 's/xxx/yyy/g' ./hoge.txt ./fuga.txt
リダイレクトしているものは、その通りリダイレクト先ファイルに結果を書き込みます。
-i
オプションを指定すると、指定しているファイルを実行結果で更新します。
リダイレクトや-i
を指定しなければ標準出力に結果が出力されるだけで、ファイルの編集はされません。
置換結果をさっと確認するにはいいかもしれません。
実行例
基本構文で乗せた使い方の各実行例です。
# パイプで使うとき $ cat hoge.txt 123xxx456aaa $ cat ./hoge.txt | sed -e 's/xxx/yyy/g' > ./new.txt $ cat ./new.txt 123yyy456aaa
# ファイル名指定して使うとき $ cat hoge.txt 123xxx456aaa $ sed -e 's/xxx/yyy/g' ./hoge.txt > ./new.txt $ cat ./new.txt 123yyy456aaa
# リダイレクトを使わずファイルを書き換える(複数可) $ cat ./hoge.txt 123xxx456aaa $ cat ./fuga.txt ABCDEFxxxGHIJKxxxxx $ sed -i -e 's/xxx/yyy/g' ./hoge.txt ./fuga.txt $ cat ./hoge.txt 123yyy456aaa $ cat ./fuga.txt ABCDEFyyyGHIJKyyyxx
基本正規表現と拡張正規表現
sedには正規表現の指定方法が2種類あるようです。
それが「基本正規表現(-e)」と「拡張正規表現(-E/-r)」です。
それぞれ指定できるものが異なりますが、拡張正規表現でないと+
とか{n}
とか使えないようです。
$ echo 111abc222aaa333 | sed -e 's/1+/x/g' 111abc222aaa333 $ echo 111abc222aaa333 | sed -r 's/1+/x/g' xabc222aaa333 root@TS6400D6C9:/etc/init.d# $ echo 111abc222aaa333 | sed -E 's/1+/x/g' xabc222aaa333
また拡張正規表現を使うときは、-e
と-E
紛らわしいので、-r
を使うといいかも。
拡張正規表現構文の例
$ echo 111abc222aaa333 | sed -r 's/1+/x/g' xabc222aaa333 $ echo 111abc222aaa333 | sed -r 's/.+aaa/x/g' x333 $ echo 111abc222aaa333 | sed -r 's/(1+)abc(2+)/\2xxx\1/g' 222xxx111aaa333 $ echo 111abc222aaa333 | sed -r 's/1{2}/x/g' x1abc222aaa333
-i を使うときの注意点
スクリプトファイルでsedを使いたいとき、-i
と共に各場合、オプションをバラバラに指定しないとエラーになるかもしれません。
sed -ir
: NGsed -i -r
: OK
参考
コチラを参考にしました。ありがとうございました!