【问题标题】:How can I escape double quotes in sed command using args and echo command?如何使用 args 和 echo 命令在 sed 命令中转义双引号?
【发布时间】:2021-07-22 06:16:10
【问题描述】:

我正在编写一个 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 方面的学习远远落后于我 :)

提前谢谢你!

泽特

【问题讨论】:

  • the double quote returned by \1 and \3 当你写 在你的终端 : echo set NEX "$(echo something)" 这样做" 显示在输出中
  • @KamilCuk,它返回:非法变量名。
  • e 正在调用 shell,它将像 shell 一样解释引号。因此,只需添加一个添加引号的 sed 命令。 s/\b[.0-9]\+\b/"&"/ 也许。
  • 谢谢,它在某种程度上与s/[0-9.]+/"&"/ 一起工作,但问题是我只需要用set NEX " 替换文件中的行。顺便说一句,\b 代表什么?你为什么要逃避+?无论如何,Tyvm
  • 附上/set NEX/{} ...我会回答的。

标签: bash shell sed escaping echo


【解决方案1】:

因为 sed e 命令调用 shell,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 中的浮点数

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-01
      • 2013-01-22
      • 2015-02-07
      • 2018-03-19
      • 1970-01-01
      • 2012-05-03
      相关资源
      最近更新 更多