如何在 sed 的命令中使用 shell 变量?

如何在 sed 的命令中使用 shell 变量?

我们知道可以使用 $ 符号获取变量的值:

x=3
echo $x
3

我们是否可以使用其他方法来获取值而不使用 $ 符号。

我问这个是因为 $ 符号是 的特殊字符,并且在尝试执行此操作时sed出现错误:sed: -e expression #1, char 31: unterminated s' command

A=25 #lineNumber
destStr="192.168.1.3 192.168.1.4"
sed ""$A"s/Allow from .*/Allow from $destStr/" -i test2

当我使用转义字符时,它会打印字符串destStr(而不是值)\

sed ""$A"s/Allow from .*/Allow from \$destStr/" -i test2

使用echo而不是sed

25s/Allow from .*/Allow from  192.168.1.3
192.168.1.4
/ -i test2

答案1

正如最终编辑所示,问题与美元符号无关,而是由 的内容引起的deststr,它不是192.168.1.3 192.168.1.4而是两行,一行仅包含192.168.1.3,另一行仅包含192.168.1.4,两行均以换行符结尾。即变量替换后的实际命令为:

sed "25s/Allow from .*/Allow from  192.168.1.3
192.168.1.4
/" -i test2

现在sed逐行解释其命令行,因此它尝试解释的第一个命令是:

25s/Allow from .*/Allow from  192.168.1.3

这显然是一个未终止的s命令,因此被sed如此报告。

现在您找到的解决方案使用 ,echo有效,因为

echo $var

呼叫回显参数(因为空格没有被引用,所以它被解释为参数分隔符),第一个是192.168.1.3,第二个是192.168.1.4;两者都是 shell 不进一步解释的形式。

现在echo只输出用空格分隔的(非选项)参数,因此您现在得到命令行:

sed "25s/Allow from .*/Allow from  192.168.1.3 192.168.1.4/" -i test2

如预期。

但请注意,对于命令替换,您应该尽可能使用反引号$(),因为反引号很容易出错。因此,以下内容会满足您的要求:

sed "$A s/Allow from .*/Allow from $(echo $destStr)/" -i test2

请注意,我还利用了地址和命令之间允许有空格的事实sed来简化引用。在不可能有​​这样的额外空格的情况下,您还可以使用以下语法:

sed "${A}s/Allow from .*/Allow from $(echo $destStr)/" -i test2

另请注意,这依赖于这样一个事实,即 中的非空格字符destStr既不会被 shell 解释,也不会sed被出现在替换字符串中的字符解释。

答案2

我已经成功使用echowith 解决了我的问题:

sed ""$A"s/Allow from .*/Allow from `echo $destStr`/" -i test2

但我仍然想知道是否有其他方法可以在不使用 $ 符号的情况下获取值。

答案3

您可以在脚本中执行以下操作:

sed -e "${A}s/Allow from .*/Allow from ${destStr}/" -i test2

使用${variable}让 bash${variable}s/...按照您想要的方式解释。

答案4

关于什么

sed $A's/Allow from .*/Allow from '$destStr'/' -i test2

假设 destStr 没有白色。

或者

echo $A"s/Allow from .*/Allow from $destStr/" | sed -f - -i test2

第二种形式允许白色。

相关内容