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

问题描述

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

示例:

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

输出

set NEX "2.00"

命令:

sed -i -r 's/(set NEX ")([0-9.]+)(")/echo \1$(echo "scale=2;\2\/2" | bc)\3/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 \1$(echo "scale=2;\2\/2" | bc)\3/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",$1/2.0#e if /set NEX/' testfile

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

中的浮点数 ,

这可能对你有用(GNU sed):

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

要使 " 在回显时为文字,它们必须转义 \"。然后必须通过替换 e\\" 标志对 echo 命令的评估进行转义。