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


関連ページ