sedのファイル読込みコマンド(r
)・ファイル書き込みのコマンド(w
)が便利です。指定の位置に外部ファイルからデータを読み込んだり、パターンにマッチした部分を一括で複数のファイルに分割するなどの便利な処理を行うことができます。知っていれば、レポートの自動生成やドキュメント作成など色々な場面で役に立つと思います。
sed ファイル読込み
指定したパターンに一致する次の行以降に、指定したファイルの内容を読込みます。コマンドr
を使います。パターンを指定する方法、アドレスを指定する方法などがあります。
以下の例で、file1.txtの「header」の次の行に、load.txtの内容を読み込みます。
ファイルの準備
file1.txt
header body footer
load.txt
------------ bioinfo-dojo ------------
ファイル読み込み位置 パターンを指定する
パターン(header)に一致する行の次に、load.txtの内容を読み込みます。
$ sed '/header/r load.txt' file1.txt
header ------------ bioinfo-dojo ------------ body footer
このままでは、検索したパターンである「header」行が残るので少し工夫します。sed
のd
コマンドを一緒に使って削除します。e
コマンドをつけると連続で処理できます。
$ sed -e '/header/r load.txt' file1.txt -e '/header/d'
------------ bioinfo-dojo ------------ body footer
ファイル読み込み位置 行を指定する
行を指定して、load.txtの内容を読み込みます。数字や$
(最後の意味)などを使います。
1行目を指定
$ sed '1r load.txt' file1.txt
header ------------ bioinfo-dojo ------------ body footer
最後の行を指定
$ sed '$r load.txt' file1.txt
header body footer ------------ bioinfo-dojo ------------
複数のファイルを一度に処理する
複数のファイルに、load.txtの内容を読み込みます。
$ ls file?.txt file1.txt file2.txt
同じ形式のファイルが複数存在するとき、いっぺんに処理できる方法を知っていると便利です。
$ find -name "file?.txt" | xargs -L 1 sed -e '1r load.txt' -e '1d'
------------ bioinfo-dojo ------------ body footer ------------ bioinfo-dojo ------------ body2 footer2
sed ファイル書き込み
指定したパターンに一致する内容を、指定したファイルに書き出します。コマンドw
を使います。
以下の例では、色んな拡張子のファイルリスト(lsの結果)を、それぞれファイルに分けます。
色々な拡張子のファイルリスト(準備)
$ ls aaa.txt bbb.png ccc.py ddd.rb eee.sh fff.cpp ggg.pl hhh.txt
sed ファイル書き込み コマンドライン
ls
の結果を、sed
でフィルタリングします。「txt」の拡張子を持つファイル名を、w
コマンドでtext_listというファイルに書き出します。cat
をパイプして処理することもできます。
$ ls | sed '/txt$/w text_list'
$ cat text_list aaa.txt hhh.txt
sed ファイル書き込み スクリプトファイル
ls
の結果を、sed
スクリプトファイルでフィルタリングします。それぞれのパターンと書き出すファイル名を、w
コマンドで指定します。様々な条件を一括で処理できます。
classify.sed
/py$/w python_list /rb$/w ruby_list /pl$/w perl_list /cpp$/w c_list /sh$/w sh_list /txt$/w text_list /png$/w png_list
スクリプトファイル(classify.sed)を指定して実行
$ ls | sed -f classify.sed
生成されたファイル(*_list)とその内容
sedで指定したスクリプトファイルの内容に従って、拡張子毎にファイルに分割されました。
$ *list c_list perl_list png_list python_list ruby_list sh_list text_list
$ cat perl_list ggg.pl
$ cat python_list ccc.py