我们知道可以使用 $ 符号获取变量的值:
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
我已经成功使用echo
with 解决了我的问题:
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
第二种形式允许白色。