微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何使用 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 命令的评估进行转义。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。