匹配后替换线

时间:2013-12-09 06:46:34

标签: bash sed awk

鉴于此文件

$ cat foo.txt
AAA
111
BBB
222
CCC
333

我想用BBB替换999之后的第一行。我想出了这个命令

awk '/BBB/ {f=1; print; next} f {$1=999; f=0} 1' foo.txt

但我对使用awk或sed的任何较短命令感到好奇。

6 个答案:

答案 0 :(得分:4)

这有点短:

awk 'f{$0="999";f=0}/BBB/{f=1}1' file

f {$0="999";f=0}如果f为真,请将行设置为999,将f设置为0
如果模式匹配将/BBB/ {f=1}设置为f,则1 1打印所有行,因为1始终为真。

答案 1 :(得分:3)

也可以使用sed,它更短

sed '/BBB/{n;s/.*/999/}'

答案 2 :(得分:3)

$ awk '{print (f?999:$0); f=0} /BBB/{f=1}' file    
AAA
111
BBB
999
CCC
333

答案 3 :(得分:2)

awk '/BBB/{print;getline;$0="999"}1' your_file

答案 4 :(得分:2)

这可能适合你(GNU sed)

sed '/BBB/!b;n;c999' file

如果某行包含BBB,请打印该行,然后将以下行更改为999

答案 5 :(得分:0)

sed 's/\(BBB\)/\1\
999/'

适用于mac