【问题标题】:Using dollar sign in sed for both variable replacement and character在 sed 中使用美元符号进行变量替换和字符
【发布时间】:2017-10-20 04:43:28
【问题描述】:

我尝试使用 sed 更改名为 convergence.gnu 的文件中的一行 我有一个名为lafila的变量,它是一个文件名

目前,我可以做到:

lafila="nGas060.dat"
sed -i "6s/.*/plot \"$lafila\" using 1:2 with l/" convergence.gnu

这将我的verbage.gnu 文件的第六行正确更改为:

plot "nGas062.dat" using 1:2 with l

但是,现在我想在替换的行中包含一个美元符号来代替:

plot "nGas062.dat" using ($1/1000):2 with l

你能告诉我在我的 sed 命令中要改变什么吗?如果我转义一个美元符号,它就不能正常工作。双倍美元也行不通。

【问题讨论】:

  • 能否请您也添加示例输入和预期输出?理解这个问题对所有人都有好处。
  • 用反斜杠转义美元符号确实有效 ($ echo "\$PATH" # prints $PATH),所以你能告诉我们你尝试过的确切命令和结果吗?
  • 好的,我进行了编辑以明确在 sed 中我想先打印变量替换,然后再打印美元符号。
  • 您可以使用sed的c命令将一行替换为指定的文本,这样就不用担心替换文本中的/字符了。

标签: bash sed escaping


【解决方案1】:

我相信您的问题实际上是由 ($1/1000) 中的正斜杠引起的,它与用于分隔 sed 命令的各个组件的斜杠发生冲突。您也需要转义该正斜杠,或者使用不同的字符来分隔 sed 字符串。以下任何一项都应该有效:

lafila="nGas060.dat"
sed -i "6s/.*/plot \"$lafila\" using (\$1\/1000):2 with l/" convergence.gnu

lafila="nGas060.dat"
sed -i "6s,.*,plot \"$lafila\" using (\$1/1000):2 with l," convergence.gnu

使用不同的定界字符可能是使 sed 字符串看起来更整洁并避免使用 leaning toothpick syndrome 的好方法。

echo foo | sed "s,foo,/there/are/a/lot/of/slashes/here,"

好很多
echo foo | sed "s/foo/\/there\/are\/a\/lot\/of\/slashes\/here/"

【讨论】:

  • 给出的命令都不能读取lafila 变量。第一个和第二个导致:plot "" using ($1/1000):2 with l 带有空白空间,其中 lafila 变量应该是
  • 那只是因为我忽略了定义lafila 的部分,因为我认为您对该部分没有问题。我只是在解决似乎给您带来问题的 sed 命令。我将编辑我的答案。
【解决方案2】:

使用单引号:

sed -i '6s/.*/plot "'$lafila'" using ($1\/1000):2 with l/' convergence.gnu

单引号保护双引号,$ 不会在其中解释。但是,您确实需要转义 /

另见:

【讨论】:

  • 但是 nGas062.dat 是一个名为 $lafila 的变量。首先我需要 sed 来替换 $lafila 然后使用 $1/1000 也就是如果变量$lafila=nGas062.dat 那么我需要输出:plot "nGas062.dat" using ($1/1000):2 with l
  • 更新了答案。
  • 完美。 那个产生了预期的结果。谢谢!:sed -i '6s/.*/plot "'$lafilas'" using ($1\/1000):2 with l/' convergence.gnu 结果:plot "nGas060.dat" using ($1/1000):2 with l
【解决方案3】:

试试看:

lafila="nGas060.dat"
sed -i "6s@.*@plot \"$lafila\" using (\\\$1/1000):2 with l@" convergence.gnu

您只需要在美元符号之后转义反斜杠即可。

\\ + \$ == \\\$

【讨论】:

    猜你喜欢
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 2019-07-18
    • 2012-08-26
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    相关资源
    最近更新 更多