FreeBSD初心者運用日記 このページをアンテナに追加

 | 

2008-11-24

[][]ファイル編集に関するチップ11:08 ファイル編集に関するチップス - FreeBSD初心者運用日記 を含むブックマーク はてなブックマーク - ファイル編集に関するチップス - FreeBSD初心者運用日記 ファイル編集に関するチップス - FreeBSD初心者運用日記 のブックマークコメント

ファイルの中にある"aaa"という文字列を、以下のように改行を含む文字列に変更した場合を考える。

aaa
bbb
ccc

このような場合sedで以下のように記述する。

#!/bin/sh

sed 's/aaa/aaa \
bbb \
ccc/' hoge.dat

※ \マークは、シェルに改行コード解釈させないため。これがないと、文法エラーになる。(シェルは改行がコマンドデリミタのため)

ダブルコーテーションを使う場合は、\を\\とする。

#!/bin/sh

sed "s/aaa/aaa \\
bbb \\
ccc/" hoge.dat

※ \マークがふたついるのは、\マーク自体のエスケープが必要だからと思われる。

\マークひとつだと、sed "s/aaa/aaa bbb ccc/" hoge.dat というコマンドが実行されるだけ。

ちなみに、シェルスクリプト関数の中で、sedを使うとき

func hoge() {
    sed "s/hoge /foo \\
bar/"
}

このようになって、インデントがそろわない。格好が悪い。

これを解決する方法としては以下のようにする。

$ cat hoge.sh
#!/bin/sh
N='
'
echo hoge | sed "s/hoge/foo \\${N}bar/"
$ ./hoge.sh
foo
bar
 |