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