centos sed替换文件中的第二个匹配项不起作用

cnjp1d6j  于 2022-11-07  发布在  其他
关注(0)|答案(2)|浏览(311)

我正在使用centos 7. sed命令来替换对我无效的second事件。我尝试了以下解决方案-Sed replace at second occurrenceSed/Awk to delete second occurence of string - platform independentsed: How to delete second match in a filehttps://unix.stackexchange.com/questions/18303/sed-delete-all-occurrences-of-a-string-except-the-first-one

文件-

this
foo
is
a test
file
this
foo

我在试着逃跑-

sed 's/foo/bar/2g' file
sed 's/foo/bar/2' file
sed -i 's/foo/bar/2g' file

我希望从第二个开始用“bar”替换所有“foo”。

4uqofj5v

4uqofj5v1#

这将在包含指定模式(/foo/)的第二行和所有后续行上执行替换:

sed ':1; /foo/! { n; b1 }; :2; n; s/foo/bar/; b2' file

它由两部分组成:

  • :1; /foo/! { n; b1 };是一个循环,阅读行并将其不变地输出,直到遇到与/foo/匹配的第一行。
  • :2; n; s/foo/bar/; b2是一个循环,它重复输出当前行,读取下一行,并执行s/foo/bar/替换。对于不包含模式的行,该替换是无害的空操作。

模式的第一个匹配是第二个循环开始时的当前行,因此当第二个循环第一次执行其n命令时,它被不变地输出。

eeq64g8w

eeq64g8w2#

这可能对你有用(GNU sed):

sed -z 's/foo/bar/2' file

将整个for文件拖放到模式空间中,并将第二次出现的foo替换为bar
备选方案:

sed 'H;$!d;x;s/.//;s/foo/bar/2' file

相关问题