用 Sed 替换变量的内容

Replace content of variable with Sed

我正在尝试删除 BASH 中变量的一些内容。特别是我想从变量 $USER:

中删除以下部分
<username><![CDATA[

我的代码如下所示:

NUSER=`sed -e "s/\<username\>\<\!\[CDATA\[//" $USER`

我正在使用反斜杠转义特殊字符(我不确定这是否正确),并想从 $USER 中删除提到的部分并将结果分配给变量 $NUSER。

请帮忙。 :)

如果 $USER 是包含您要编辑的值的文件的名称,您尝试的方式(减去一些多余的反斜杠)将起作用。由于该值在变量本身中,因此您必须像这样将其通过管道传递给 sed 的标准输入:

NUSER=$(echo "$USER" | sed -e 's/^<username><!\[CDATA\[//')

$() 与反引号的作用相同,但我更喜欢这种语法,因为它更容易嵌套。

请注意,如果 $USER 具有 echo 选项的值(例如 -n-e),echo "$USER" 会导致问题。如果担心这一点,请查看 Jonathan Leffer 使用 bash-specific here-strings 的解决方案。

'works everywhere' 解决方案由 Wintermute in another 建议。

仅 Bash 的解决方案使用 here-string 来代替——这就是 <<< 表示法:

NUSER=$(sed -e 's/^<username><!\[CDATA\[//' <<< "$USER")

它的优点是避免了子进程中的第二个进程shell。

NUSER="${USER%%<!*}"
在这种情况下,

使用 shell 变量操作比打开 subshell 和 sed 操作要快得多(但这不是对要求使用 sed 的请求的确切答复)