【问题标题】:sed backreference not being found未找到 sed 反向引用
【发布时间】:2019-11-26 20:30:19
【问题描述】:

我正在尝试使用“sed”将文件中的路径列表替换为另一个路径。

要处理的示例字符串是:

/path/to/file/block

我想将 /path/to/file 替换为其他内容。

我试过了

sed -r '/\s(\S+)\/block/s/\1/new_path/'

我知道它正在查找匹配的字符串,但我收到无效的反向引用错误。

我该怎么做?

【问题讨论】:

  • sed -E 's@\s(\S+)/block@\1/new_path@' <<< " /path/to/file/block"?您也可以使用sed -r '/\s(\S+)\/block/s//\1\/new_path/' <<< "$s",但我建议在这里直接替换。

标签: sed backreference


【解决方案1】:

这可能会:

echo "/path/to/file/block" | sed -r 's|/\S*/(block)|/newpath/\1|'
/newpath/block

测试

echo "test=/path/file test2=/path/to/file/block test3=/home/root/file" | sed -r 's|/\S*/(block)|/newpath/\1|'
test=/path/file test2=/newpath/block test3=/home/root/file

【讨论】:

    【解决方案2】:

    反向引用总是引用s 命令的模式,而不是任何地址(在命令之前)。

    但是,在这种情况下,不需要寻址:我们可以将替换应用于所有行(它只会更改匹配的行),所以我们可以这样写:

    s,\s(\S+)/block/, \1/new_path,
    

    (我在 RHS 中添加了一个空格,因为我猜您并不是要覆盖它;还使用了不同的分隔符来减少对反斜杠的需求。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-18
      • 1970-01-01
      • 1970-01-01
      • 2013-10-22
      • 2021-12-15
      • 1970-01-01
      • 2020-09-09
      • 2014-01-08
      相关资源
      最近更新 更多