linux 替换包含任意特殊字符的字符串[重复]

b5buobof  于 2023-06-21  发布在  Linux
关注(0)|答案(1)|浏览(105)

此问题已在此处有答案

Is it possible to escape regex metacharacters reliably with sed(4个答案)
5天前关闭。
我正在尝试使用sed替换文本文件中的字符串。该字符串可以包含任何特殊字符,如./$等。然而,我有兴趣替换这样一个字符串 * 字面上 *,也就是不解释./$等。作为特殊人物。
简单的说明
sed -i s|$old|$new| "$path_to_file"
例如,如果我想用20.9替换20.8,它就不能像我期望的那样工作。
当然,在启动使用这个sed的脚本之前,我不知道用户将把特殊字符放在哪里。
有没有一种方法可以使用sed或任何其他工具(perlawk等)来完成此操作?
谢谢!

xzlaal3s

xzlaal3s1#

如果file不包含null,并且在内存中很合适,你可以直接使用bash参数扩展:

data=$(<"$path_to_file")
echo "${data//"$old"/"$new"}" >"$path_to_file"

不要忘记双引号,它们禁用特殊模式字符。
注意事项:

  1. date=$(...)去掉尾随的换行符;使用mapfile保存它们
  2. echo在某些转角条件下可能产生非预期输出;使用printf来避免它们
    所以,稍微长一点但改进了很多的版本:
mapfile -d '' data <"$path_to_file"
printf '%s' "${data//"$old"/"$new"}" >"$path_to_file"

相关问题