sedコマンドの使い方
sedの概要
sedとは
sedは「Stream EDitor」の略であり、非対話的なストリーム指向(ファイルからの入力を一度に一行ずつ読み込み、結果を標準出力に書き出す)エディタです。
文字列を置換する、抽出する、削除する、など様々なテキストの加工処理を実現できます。
外部ファイル(スクリプトファイル)として記述したり、正規表現によるパターンマッチング処理を行うこともできます。
sedコマンド書式
sedの命令はアドレスと編集コマンドで構成されます。
sed [オプション] スクリプトコマンド 入力ファイル
実行例:大文字を小文字に変換します。
$ cat sed_test.txt
GNU is Not Unix
$ sed 's/\(.*\)/\L\1/' sed_test.txt
gnu is not unix
標準入力を受け取る実行方法
コマンド実行結果に対してパイプを用いて標準入力を受け取り、それをsedでテキスト加工することができます。
$ echo "momo-chienoki" | sed "s/-/ /"
momo chienoki
sedスクリプトファイルの作成と実行
「.sed」という拡張子のスクリプトファイルを作成しておき、「-f」オプションで読み込むことができます。(とはいえ、ほとんど使う機会はありません。シェルスクリプトのほうが自由度が高く、細かく記述できます。)
$ cat TargetFile.txt
Done is better than perfect.
$ cat script.sed
s/\(.*\)/\U\1/
$ sed -f script.sed TargetFile.txt
DONE IS BETTER THAN PERFECT.
sedの基本操作
iオプション
sedは、そのまま実行しても標準出力に表示されるだけで、ファイルの中身が書き換わりません。
標準出力せずにファイルを上書きで書き換える場合には「i」オプションを指定します。
$ cat TargetFile.txt
before
$ sed -i "s/before/after/g" TargetFile.txt
$ cat TargetFile.txt
after
パイプとリダイレクトを組み合わせて上書きすることも可能です。
(リダイレクトで直接上書きするとファイルが空になります。一旦別ファイルに出力してからリネームします。)
$ cat TargetFile.txt
after
$ cat TargetFile.txt | sed "s/after/done/" > _tmp.txt
$ mv _tmp.txt TargetFile.txt
$ cat TargetFile.txt
done
eオプション
-eオプションを使うと複数条件指定できます。
$ echo "xxxxxxxxxx" | sed -e "s/xxx/123/" -e "s/xxx/123/" -e "s/xxx/123/"
123123123x
パイプで標準出力を受け渡すこともできます。
$ echo "xxxxxxxxxx" | sed "s/xxx/123/" | sed "s/xxx/123/" | sed "s/xxx/123/"
123123123x
(補足)もちろん、同条件の繰り返しは「g」指定でOKです。
$ echo "xxxxxxxxxx" | sed -e "s/xxx/123/g"
123123123x
zオプション
sedコマンドは通常、文字列を改行で分割しますが、NULLで行を分割した場合に「z」オプションを指定します。
例えば、改行コードをLf(UNIXファイル)からCrLf(Windowsファイル)に置換しようとする場合、
$ od -c TargetFile.txt
0000000 1 2 3 4 5 6 7 8 9 A B C D E F \n
0000020 a b c d e f g h i j k l m n o \n
0000040
単純に「\n」を「\r\n」に置き換えてもみても変更されません。
$ sed "s/\n/\r\n/g" TargetFile.txt > _tmp.txt
$ od -c _tmp.txt
0000000 1 2 3 4 5 6 7 8 9 A B C D E F \n
0000020 a b c d e f g h i j k l m n o \n
0000040
「z」オプションを指定すると、改行コードが「\n」を「\r\n」に置き換わります。
$ sed -z "s/\n/\r\n/g" TargetFile.txt > _tmp.txt
$ od -c _tmp.txt
0000000 1 2 3 4 5 6 7 8 9 A B C D E F \r
0000020 \n a b c d e f g h i j k l m n o
0000040 \r \n
0000042
sedコマンド実行例
sedで改行コードを CrLfからLfに置換する。
現在ディレクトリ以下のすべての「.vue」ファイルの改行コードをCrLfからLfに置換します。
sedの「-i」オプションを指定することで、ファイルに対して上書き保存を実行します。
また、sedの「-z」オプションは通常は改行で分割するところを、NULL文字で行を分割するようになります。
find . -type f -name "*.vue" | xargs sed -i -z 's/\r\n/\n/g'
sedで小文字から大文字へ置換する。
GNU拡張されたsedであれば、「\U\1」で大文字に変換できます。
$ echo "unix" | sed 's/\(.*\)/\U\1/'
UNIX
逆に、大文字から小文字に変換する場合は以下のコマンドを実行します。
$ echo "Windows" | sed 's/\(.*\)/\L\1/'
windows
電話番号データから先頭の「TEL: 」を削除します。
$ echo 'TEL: 0120-000-000' | sed 's/[A-Z :]//g'
0120-000-000