sedの覚書
$ 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/と展開されて正しい文法となる。