我想到了以下几点:
xx=abc ; echo "abcde-123" | sed -e s/$xx/$xx_nnn/g
会导致 abcde_nnn123
.然而结果是
德-123
可以看出,前缀xx=abc
被删除,并且_nnn
替换模式中的 被完全忽略。为什么会发生这种情况?
答案1
主要问题在这里:/$xx_nnn/
您实际上传递了一个$xx_nnn
实际上不存在的变量。所以基本上你正在运行:
xx=abc ; echo "abcde-123" | sed -e s/$xx//g
#or what is equivalent:
echo "abcde-123" | sed -e s/abc//g
因此你会得到:de-123
,你abc
什么都没有替换。
最好的解决方案是使用:${varname}
,例如:
xx=abc ; echo "abcde-123" | sed -e "s/$xx/${xx}_nnn/g"
后面的所有内容}
都不会成为变量名称的一部分。
关于:
将导致 abcde_nnn123
不会是这样的结果。使用sed
您提供的命令,您将得到:
abc_nnnde-123
所以如果你真的想得到:abcde_nnn123
那么你的代码应该如下所示:
xx=abcde ; echo "abcde123" | sed -e "s/$xx/${xx}_nnn/g"
您还可以使用替换字符串bash参数扩展。例如:
str='abcde123'
xx='abcde'
echo "${str/$xx/${xx}_nnn}" # means: in 'abcde123' replace 'abcde'
#with `abcde_nnn`