【问题标题】:Sed doubts when n occurrences are used使用 n 次出现时 sed 怀疑
【发布时间】:2018-07-16 09:03:39
【问题描述】:

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

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

【问题讨论】:

  • 欢迎来到 Stack Overflow!请澄清您的具体问题正如目前所写的那样,很难准确地说出您在问什么。请edit您的问题并包括额外的信息,例如您用来导致您所做的陈述的命令。这将帮助其他人看到问题,以便他们可以帮助您。要进行编辑,请单击位于问题下方和左侧一行的帖子的 edit 链接,然后粘贴请求的材料。另外,看看How to Ask
  • 我是否正确理解您想用 new 替换子字符串 old 的第 n 个 次出现。还是要替换前 n 次出现?根据您的编辑,我了解到您尝试了 sed 's/old/new/g'sed 's/old/new/3g'。还有,你为什么说sed "s/old/new/1"不做任何替换?
  • 我已经更新了你的问题。你能检查一下这是否反映了你想要的吗?
  • 所以我有三行......在所有这些行中我都有“测试”这个词,但我只想在第二行和第三行替换它。所以我使用了命令 "s/old/new/2" 和 "s/old/new/3" 。但内容不会被替换。这是正确的方法还是我有不同的方法来解决这个问题?
  • 是的,更新后的问题是正确的

标签: sed shell awk sed


【解决方案1】:

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

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

导致未指定的行为

如果你想替换文件中的 nth 次, 不是正确的工具,但 可能会更好.

  • 如果你知道每行最多出现一次“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
    

【讨论】:

  • 我将给出我需要解决方案的示例。我有以下几行 - 第 1 行 - “测试” 第 2 行 - “测试”,如果我使用上面的命令它不起作用,而它与 /g 一起工作。我在 shell 脚本中使用它。我应该做些什么不一样?
  • 所以基本上 /3 搜索一行中的第三个出现,而不是我希望它像文件中的第三个出现
  • @Ragavendarbalaji 我已更新答案以满足您的要求
  • 你能告诉我这个命令的错误是什么吗:awk -v n=2 '/\'text\' =>.*/^C{ if (++count == n) sub(/\'text\' =>.*/, "\'text\' => \'my-text\',"); } 1' 文件名.php
  • @Ragavendarbalaji 我不知道这个命令应该做什么,但^C 看起来有点狡猾
猜你喜欢
  • 2011-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多