我正在尝试替换文件中子字符串的 n th 出现。我尝试使用sed来实现这一点,但是所有尝试都没有给我想要的输出。一些尝试是:
sed 's/old/new/g'
sed 's/old/new/3'
sed 's/old/new/3g'
答案 0 :(得分:0)
sed的最常见用法是执行替换,例如
sed 's/foo/bar/' file
这将用字符串foo
替换字符串bar
的第一个匹配项,并将对file
中的每一行执行该操作。
如果只想替换字符串foo
的第3次出现,但是每行都要这样做,则可以编写:
sed 's/foo/bar/3' file.
最后,如果要替换所有出现的内容,请使用:
sed 's/foo/bar/g' file.
任何组合,例如
sed 's/foo/bar/3g' file
导致未指定行为。
如果要替换文件中的 n th 项,sed不是正确的工具,而是perl或{{ 3}}可能会更好。
如果您知道每行最多出现一次
awk '/foo/{c++}(c==n){sub("foo","bar")}1' file
如果每行出现的次数可能超过一次,则变得更加棘手,可以采用多种解决方案:
awk 'BEGIN{FS="foo";OFS="bar";n=5}
(c<n) && (c+NF-1>=n) {
for(i=1;i<NF;++i) printf $i ((++c==n) ? OFS : FS); print $NF; next
}
{c+=NF-1; print}' file