有没有办法使用 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//|/\\|}|"