【问题标题】:Backreferences in sed returning wrong valuesed 中的反向引用返回错误值
【发布时间】:2013-02-17 18:28:52
【问题描述】:

我正在尝试使用 sed 替换表达式。正则表达式在 vim 中有效,但在 sed 中无效。我用斜线替换数字前的最后一个破折号,所以

/www/file-name-1 

应该返回

/www/file-name/1

我正在使用以下命令,但它一直在输出 /www/file-name/0

sed 's/-[0-9]/\/\0/g' input.txt

我做错了什么?

【问题讨论】:

    标签: regex macos sed


    【解决方案1】:

    OS X 下的 sed 似乎从 1 开始计算反向引用。尝试使用 \1 而不是 \0

    【讨论】:

    • 如果我使用 \1 它返回“\1 未在 RE 中定义”
    • OS X / macOS 有古老的 UNIX 工具。您不能使用-r,这意味着您需要转义括号。
    • OS X 的 sed 使用 -E 而不是 -r 来启用扩展的正则表达式
    【解决方案2】:

    您必须将数据括在括号中以便稍后引用它,并且sed 开始计数为 1。要恢复所有匹配的字符而不需要括号,使用 & 符号。

    sed 's/-\([0-9]\)/\/\1/g' input.txt
    

    产生:

    /www/file-name/1
    

    【讨论】:

    • 这是正确答案。我没有注意到 @user2052491 没有使用括号。
    • 大括号前的反斜杠不是必须的,不是吗?
    【解决方案3】:

    您需要先使用括号进行捕获,然后才能反向引用(以\1 开头)。试试sed -r 's|(.*)-|\1/|':

    $ sed -r 's|(.*)-|\1/|' <<< "/www/file-name-1" 
    /www/file-name/1
    

    您可以将任何分隔符与sed 一起使用,因此当替换包含/ 时,/ 不是最佳选择。 -r 选项用于扩展正则表达式,因此不需要转义括号。

    【讨论】:

      猜你喜欢
      • 2013-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多