我正在使用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”。
2条答案
按热度按时间4uqofj5v1#
这将在包含指定模式(
/foo/
)的第二行和所有后续行上执行替换:它由两部分组成:
:1; /foo/! { n; b1 };
是一个循环,阅读行并将其不变地输出,直到遇到与/foo/
匹配的第一行。:2; n; s/foo/bar/; b2
是一个循环,它重复输出当前行,读取下一行,并执行s/foo/bar/
替换。对于不包含模式的行,该替换是无害的空操作。模式的第一个匹配是第二个循环开始时的当前行,因此当第二个循环第一次执行其
n
命令时,它被不变地输出。eeq64g8w2#
这可能对你有用(GNU sed):
将整个for文件拖放到模式空间中,并将第二次出现的
foo
替换为bar
。备选方案: