lisz-works

プログラミングと興味を貴方に

sedコマンドの備忘録

【スポンサーリンク】

Linuxペンギン

こんにちは、lisです!

Linuxのsedコマンドを使いたくなっても、すぐ使い方忘れるので備忘録記事です。

基本構文

それぞれ入力文字列内にあるすべてのxxxyyyに置換します。

# パイプで使うとき
$ 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: NG
  • sed -i -r: OK

参考

コチラを参考にしました。ありがとうございました!

hydrocul.github.io