Sed怀疑何时使用n次

时间:2018-07-16 09:03:39

标签: shell awk sed

我正在尝试替换文件中子字符串的 n th 出现。我尝试使用来实现这一点,但是所有尝试都没有给我想要的输出。一些尝试是:

sed 's/old/new/g'
sed 's/old/new/3'
sed 's/old/new/3g'

1 个答案:

答案 0 :(得分:0)

的最常见用法是执行替换,例如

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 项,不是正确的工具,而是或{{ 3}}可能会更好。

  • 如果您知道每行最多出现一次 个“ foo”,则可以这样做

    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