Hatena::ブログ(Diary)

計算機と戯れる日々 このページをアンテナに追加 RSSフィード

2008-11-10

sedにて一番最初にマッチしたモノだけを置換するには

問題
以下の入力のうち最初に現れたbbbbをddddにsedにて置換せよ。
aaaa
 bbbb
  cccc
aaaa
 bbbb
aaaa
 bbbb
解答
sの前に 1,/bbbb/を付ける
$ echo -e "aaaa\n bbbb\n  cccc\naaaa\n bbbb\naaaa\n bbbb" | sed 1,/bbbb/s/bbbb/dddd/
aaaa
 dddd
  cccc
aaaa
 bbbb
aaaa
 bbbb

他のサイトでは1,だけで良いとあるのだが… /bbbb/を二回書くのが冗長だなぁ

$ echo -e "aaaa\n bbbb\n  cccc\naaaa\n bbbb\naaaa\n bbbb" | sed 1,s/bbbb/dddd/
sed: -e 表現 #1, 文字数 3: unexpected `,'
$ echo -e "aaaa\n bbbb\n  cccc\naaaa\n bbbb\naaaa\n bbbb" | sed 1,/bbbb/s//dddd/
sed: -e 表現 #1, 文字数 0: no previous regular expression
$ echo -e "aaaa\n bbbb\n  cccc\naaaa\n bbbb\naaaa\n bbbb" | sed 1,/bbbb/s/\1/dddd/
aaaa
 bbbb
  cccc
aaaa
 bbbb
aaaa
 bbbb
$ echo -e "aaaa\n bbbb\n  cccc\naaaa\n bbbb\naaaa\n bbbb" | sed '1,/(bbbb)/s/\1/dddd/'
sed: -e 表現 #1, 文字数 20: 無効な後方参照です

まあでも応用するとccccとbbbbに囲まれた中でのみaaaa->eeeeという置換も出来るからいいか。

$ echo -e "aaaa\n bbbb\n  cccc\naaaa\n bbbb\naaaa\n bbbb" | sed /cccc/,/bbbb/s/aaaa/eeee/
aaaa
 bbbb
  cccc
eeee
 bbbb
aaaa
 bbbb
トラックバック - http://d.hatena.ne.jp/n9d/20081110/1226284188