我有一个看起来像这样的文件
000099990000 Carlos C
000099990000 Ana B
000099990000 Ana A Test
000099990000 Ana B
000099990000 Carlos C
我想找到第一次出现的Ana B
,然后用9999
替换匹配线的1111
部分。
我正在运行以下行:
sed -i '0,/Ana B/ s/9999/1111/' file.txt
但我得到以下结果:
000011110000 Carlos C
000011110000 Ana B
000099990000 Ana A Test
000099990000 Ana B
000099990000 Carlos C
所以sed
正在取代所有的线,直到第一次出现Ana B
。我的命令出了什么问题?
$ sed '0,/Ana B/ { //s/9999/1111/ }' ip.txt
000099990000 Carlos C
000011110000 Ana B
000099990000 Ana A Test
000099990000 Ana B
000099990000 Carlos C
{ //s/9999/1111/ }
这里的{}
允许将命令分组,仅在满足0,/Ana B/
条件时执行//
将重复使用最后使用的正则表达式,与使用/Ana B/
相同 - 这将确保只更改包含Ana B
的行你也可以在这里使用awk
:
$ awk '/Ana B/ && !c++{sub(/9999/, "1111")} 1' ip.txt
000099990000 Carlos C
000011110000 Ana B
000099990000 Ana A Test
000099990000 Ana B
000099990000 Carlos C
/Ana B/ && !c++
并且Ana B
为零(未初始化变量的默认值),则c
因为++
下次c
将是1
并且条件将失败(注意Ana B
的非常大的比赛可能导致溢出和c
再次成为0
)sub(/9999/, "1111")
将9999
改为1111
1
用于打印$0
内容的惯用方法(输入记录)