替换包含任意特殊字符的字符串

huangapple go评论61阅读模式
英文:

Replace a string containing arbitrary special characters

问题

我正在尝试使用 sed 在文本文件中替换一个字符串。这个字符串可能包含任何特殊字符,如 ., /, $ 等。然而,我希望将这样的字符串 字面地 替换,即不将 ., /, $ 等解释为特殊字符。

所以,简单的指令

sed -i s|$old|$new| "$path_to_file"

如果我想用 20.9 替换 20.8,就不能按照我期望的方式工作。

当然,在启动使用这个 sed 的脚本之前,我不知道用户会在哪里放置特殊字符。

有没有办法使用 sed 或其他工具(如 perlawk 等)来实现这一点?

谢谢!

英文:

I'm trying to replace a string inside a text file using sed. This string could contain any special character like ., /, $, etc. However, I'm interested to replace such a string literally, that is to not interpret ., /, $, etc. as special characters.

So, the simple instruction

sed -i s|$old|$new| "$path_to_file"

doesn't work as I expect if I want to replace 20.8 with 20.9 for example.

Of course, before starting the script that uses this sed, I don't have any idea where the special characters will be placed by the user.

Is there a way to do this with sed or any other tools (perl, awk, etc.)?

Thanks!

答案1

得分: 0

如果文件不包含空值并且可以轻松地放入内存中,您可以直接使用bash参数扩展:

data=$(<"文件路径")
echo "${data//"$旧值"/"$新值"}" >"文件路径"

不要忘记双引号,它们会禁用特殊的模式字符。


注意:

  1. date=$(...) 剥离末尾的换行符;使用 mapfile 来保留它们。
  2. echo 可能在某些边界条件下产生意外的输出;使用 printf 来避免这些问题。

因此,稍微长一些但改进很多的版本如下:

mapfile -d '' data <"文件路径"
printf '%s' "${data//"$旧值"/"$新值"}" >"文件路径"
英文:

If file does not contain nulls and will fit comfortably in memory, you can just use bash parameter expansion directly:

data=$(&lt;&quot;$path_to_file&quot;)
echo &quot;${data//&quot;$old&quot;/&quot;$new&quot;}&quot; &gt;&quot;$path_to_file&quot;

Don't forget the double-quotes, they disable special pattern characters.


Notes:

  1. date=$(...) strips trailing newlines; use mapfile to keep them
  2. echo can produce unintended output in some corner conditions; use printf to avoid them

So, slightly longer but much improved version:

mapfile -d &#39;&#39; data &lt;&quot;$path_to_file&quot;
printf &#39;%s&#39; &quot;${data//&quot;$old&quot;/&quot;$new&quot;}&quot; &gt;&quot;$path_to_file&quot;

</details>



huangapple
  • 本文由 发表于 2023年6月15日 21:18:25
  • 转载请务必保留本文链接:https://go.coder-hub.com/76482915.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定