使用 sed 附加后缀:为什么变量在第二次使用时被忽略?

使用 sed 附加后缀:为什么变量在第二次使用时被忽略?

我想到了以下几点:

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`

相关内容