我正在从现有文件中提取一部分,并将其作为字符串存储在变量中。字符串看起来像这样:
var="*a<br>*b<br>*c"
现在,由于*是unix中的一个特殊字符,它在后续操作(如sed,grep)中不起作用,直到我在每个*
前面加上转义字符。这就是为什么,我在做这样的事情-
echo $var | sed 's/*/\*/g'
在bash中运行这个命令,我们得到
echo $var | sed 's/*/\*/g'
*a<br>*b<br>*c
这是期望的输出,但是当我尝试将其存储在变量中时,我将返回我的原始变量,如
var=`echo $var | sed 's/*/\*/g'`
echo $var
*a<br>*b<br>*c
我假设发生这种情况是因为变量忽略了将它们解释为转义字符的反斜杠。我如何保留反斜杠并将它们存储在变量中?
问题是由反引号引起的。用$( )
代替,它就消失了:
var="*a<br>*b<br>*c"
var=$(printf '%sn' "$var" | sed 's/*/\*/g')
printf '%sn' "$var"
(为什么这个问题是由反引号引起的?因为嵌套它们的唯一方法是用反斜杠转义内部的,所以它们必然改变反斜杠的行为;而$( )
,因为它使用不同的开始和结束符号,可以本地嵌套)。
也就是说,如果您的shell是具有ksh扩展的shell(如bash),则在这里根本不需要sed
,因为shell可以通过参数扩展本地执行简单的字符串替换:
var="*a<br>*b<br>*c"
printf '%sn' "${var//'*'/'*'}"
有关为什么这个答案使用printf
而不是echo
的背景信息,请参阅为什么printf比echo更好?在[unix。[/p],或者echo
的POSIX规范的APPLICATION USAGE部分。