【问题标题】:Replacing regex groups with sed用 sed 替换正则表达式组
【发布时间】:2014-02-05 15:01:56
【问题描述】:

我正在尝试替换(使用 sed)与正则表达式匹配的组,但我能从测试中得到的最好结果是替换 sed 分隔符右侧的整个字符串的字符串。

例子:

echo "this is a sample id='42' string" | sed -r "s/id='(.*?)'/\11/g"

输出:

this is a sample 421 string

期望的输出:

this is a sample id='1' string

这可能吗?怎么样?

编辑:

我要做的是实际替换 just 正则表达式匹配的组,而不是 sed 脚本左侧的整个字符串。 换句话说:我只想用 '1' 替换 '42' 而不使用 "id=''"。

【问题讨论】:

  • 不清楚你的意思。你能用更多的例子改进解释吗?
  • @fedorqui 完成,请查看编辑
  • 嗯,然后从我删除的答案中,这应该是 --> echo "this is a sample id='42' string" | sed -r "s/'[^']*'/'5'/" 。也就是说,只检查单引号之间的任何内容。
  • @fedorqui 不,您仍在使用''5'' 不在我的组中 (id='(.*?)')。我只想替换 (.*?)
  • 然后你可以捕捉它们并打印回来。请注意,当使用sed s/sth/new/g 时,sth 将被替换为new,因此如果您在sth 中有它,则必须在new 中打印回来。因此,您可以使用sed -r "s/(')[^']*(')/\15\2/",尽管它看起来有点过分。

标签: regex bash sed


【解决方案1】:

sed 中,整个 左正则表达式被整个 右正则表达式替换。如果您想保留左侧正则表达式的一部分,则必须将其显式复制到右侧或将其设为捕获组:

echo "this is a sample id='42' string" | sed -r "s/id='(.*?)'/\11/g"

将正确地用421 替换所有匹配项id='42',因为\142。如果你想保留上面写着id=...的部分,你必须把它放在替换中:

echo "this is a sample id='42' string" | sed -r "s/id='(.*?)'/id='1'/g"

【讨论】:

    【解决方案2】:

    可能是这样的?

    $ echo "this is a sample id='42' string" | sed -r "s/id='.*?'/id='1'/g"
    

    结果:

    这是一个示例 id='1' 字符串

    或者你可以这样做:

    $ echo "this is a sample id='42' string" | sed -r "s/(id=')(.*?)(')/\11\3/g"
    this is a sample id='1' string
    

    结果:

    这是一个示例 id='1' 字符串

    【讨论】:

    • 不,请参阅我的问题下的 cmets。这绝对不是我想要的。
    • AFAIK sed 没有look(ahead|behind) 能力,所以整个模式无论如何都会被某些东西取代。但是,如果您的模式像您的示例一样简单,那么将其复制到替换部分似乎没有问题。
    • 我添加了另一个选项,没有将模式作为常量重复,仅作为组副本。
    • 在 sed 中没有非捕获括号对他来说是最好的答案恕我直言。
    • 这实际上可以工作。我正在寻找一些不需要从字符串左侧复制到右侧的解决方案,但我刚刚意识到 sed 不能这样做,所以这确实是最好的答案。谢谢
    【解决方案3】:

    这是awk的简单方法

    echo "this is a sample id='42' string" | awk -F\' '{$2=1}1' OFS=\'
    this is a sample id='1' string
    

    它确实使用' 作为字段分隔符,然后只替换字段#2 中的值

    这应该也可以:

    awk -F\' '$2=1' OFS=\'
    

    【讨论】:

      猜你喜欢
      • 2021-12-31
      • 2018-08-22
      • 2013-08-25
      • 2012-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多