如何使用 args 和 echo 命令转义 sed 命令中的双引号?

How can I escape double quotes in sed command using args and echo command?

我正在编写一个 bash 脚本,试图在文件中找到一个正则表达式,用这个数字除以 2 替换(用 sed)对应于浮点数的正则表达式的一部分。

示例:

echo set NEX \"2.00\" > testfile
cat testfile

输出:

set NEX "2.00"

命令:

sed -i -r 's/(set NEX ")([0-9.]+)(")/echo $(echo "scale=2;\/2" | bc)/e' testfile
cat testfile

输出:

set NEX 1.00

所以,我的问题是 sed 命令中的 echo 似乎没有转义和解释 \1 和 \3 返回的双引号。我尝试了许多转义技巧,例如使用 \ 或 '"'"' 但它仍然不起作用。 我很乐意得到一些帮助并了解更多关于 bash 的信息,我在 shell 的学习远远落后于我:)

提前致谢!

zet

因为 sed e 命令调用 shell,它解释掉引号,最简单的方法是在后续 sed 命令中简单地替换引号:

sed -r '/set NEX/{s/(set NEX ")([0-9.]+)(")/echo $(echo "scale=2;\/2" | bc)/e;s/\b[0-9.]+\b/"&"/}' testfile

上面在您的命令周围添加 /set NEX/{},然后在其后添加 s/\b[0-9.]+\b/"&"/ 以将浮点数括在双引号中。

Perl 在这里可能更直接,但实际上并不多:

perl -pe 's#\b([.0-9]+)\b#sprintf "%3.2f",/2.0#e if /set NEX/' testfile

Perl 不会丢失双引号,只是修改 s###e

中的浮点数

这可能适合您 (GNU sed):

sed -E 's/(set Nex)"([0-9]+)"/echo \"$(echo "scale=2;\/2"|bc)\"/e' file

要使 " 在回显时成为文字,必须对 \" 进行转义。然后必须通过替换 \".

e 标志对 echo 命令的评估进行转义