用于查找和替换值的通用 sed 命令

用于查找和替换值的通用 sed 命令

有没有办法使用 sed 将任何字符串替换为任何其他字符串?因为 sed 在查找和替换表达式中使用分隔符,所以我无法找到一种方法来编写 sed 命令,该命令能够用任何路径中的任何字符(或所有字符)替换任何其他字符串(这可能是也包含任何字符)。

这是我所拥有的不起作用的示例:

new_value="foobar"
old_value="baz"
echo "$some_path" | sed -e "s|$old_value|$new_value|"

除非$new_value$old_value包含管道,否则该命令有效,在这种情况下该命令无效,因为替换语法被 sed 表达式中使用的变量破坏。

有没有办法使用 sed 将任何字符串替换为任何其他字符串?

如果没有,有没有 Unix 好的替代方案?

答案1

解决这个问题的一个简单方法是在调用之前转义变量中的所有内容sed

new_value="foo|bar"
old_value="ba|z"
new_value=$(printf '%q' "$new_value")
old_value=$(printf '%q' "$old_value")
some_path="/path/to/ba|z/file"

进而:

$ echo "$some_path" | sed -e "s|$old_value|$new_value|"
/path/to/foo|bar/file

这里的技巧是printf '%q'.来自help printf(显示 bash 内置的帮助printf):

  %q    quote the argument in a way that can be reused as shell input

答案2

您可以使用 shell 参数替换来转义所需的字符:

sed -e "s|${old_value//|/\\|}|${new_value//|/\\|}|"

相关内容