如何才能在第一次出现匹配的行上进行替换?

问题描述 投票:1回答:1

我有一个看起来像这样的文件

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。我的命令出了什么问题?

awk sed text-processing
1个回答
2
投票
$ 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内容的惯用方法(输入记录)
© www.soinside.com 2019 - 2024. All rights reserved.