sedの覚書

 
tiutiu.net/ プログラム/language/sed/
2007/4/26
文字列の変換
$ sed "s/foo/hoge/g" original.txt > change.txt

original.txtの中のfooという文字列が全てhogeという文字列に置き換わる。 sedは結果を標準出力に出すので, リダイレクトしてchange.txtに 入れている。最後のgは繰り返して行えという命令である。

通常は上の例のように, /で変換元と変換後の文字列を区切るのだが, このデ リミタは, 別に/である必要はなく, sの直後に来るもので区切る。たとえば, 次の例でも正しい。

$ url='http://localhost/hoge/foo.html
$ page=`echo $url | sed 's#.*/##'`
$ echo $page
foo.html
行の表示

通常sedは文字の変換に使われことが多いが, Stream Editorというだけあっ て, こんなこともできる。これにはpを使う。

$ sed -n "3,10p" foo.html

これで, 3行目から10行目まで表示される。最後の行まで表示したいなら, $が 最後の行をあらわす文字になっている。-nオプションがないと, 全体を表示し てしまうので注意。

行を指定するのではなく, 文字を指定したいなら, 次のようにする。

$ sed -n '/<div/p' sed.html

これで, このファイルの中から, "<div"を含む行を表示する。 pを!pにすると, 該当しないものだけを表示するようになる。

行の削除

行の表示におけるpをdにすれば, 該当の行は表示の対象にならない。

制御コードへの変換
$ sed -i 's/<br>/<br>\x0A/g' hoge.html

html中に<br>があれば, その後に必ず改行をつける。 文字コードを直接指定するときは"\x"に続けて2桁の16進表記で文字を 表す。

-iは指定したファイルを変換するオプション。通常は結果は 標準出力へ出力されるが, -iをつけると, 結果は指定した ファイルへ戻される。

文字列の抽出

ある形式にマッチした文字列を抽出したいときは\1, \2...を使用する。 抽出対象の表現は\(と\)でくくる。

$ echo http://www.example.com/ | sed 's+^[^/]*//\([^/]*\)/.*$+\1+'

//から次の/の間の文字を抽出してドメイン名を抽出している。

シェルの変数を利用する場合

次はエラー

#!/bin/sh
new=bar/hoge
sed -i "s/keyword/$new/" foo.txt

なぜなら, s/keyword/$new/を展開するとs/keyword/bar/hoge/になるから。 しかし, 次もエラー。

#!/bin/sh
new=bar\/hoge
sed -i "s/keyword/$new/" foo.txt

newの定義で/に\がついている。エラーになるのは, \/がnewに 代入される時点で/に変換されるので, 結局 s/keyword/$new/の展開はs/keyword/bar/hoge/となる。

したがって, 次が正解。

#!/bin/sh
new=bar\\/hoge
sed -i "s/keyword/$new/" foo.txt

これでnewはbar\/hogeとなって, s/keyword/$new/は s/keyword/bar\/hoge/と展開されて正しい文法となる。


Google