用Sed替换变量的内容

时间:2015-01-06 22:27:33

标签: bash sed

我试图删除BASH中某些变量的内容。特别是我想从变量$ USER:

中删除部分后面的部分
<username><![CDATA[

我的代码如下所示:

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

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

请帮助。 :)

3 个答案:

答案 0 :(得分:3)

如果$USER是包含您要编辑的值的文件的名称,那么您尝试的方式(减去一些多余的反斜杠)将起作用。由于值在变量本身中,因此必须将其传递给sed的stdin,如下所示:

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

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

请注意,如果echo "$USER"具有$USER选项的值(例如echo-n),-e会导致问题。如果这是一个担心,请看看Jonathan Leffer的解决方案,其中包含特定于bash的字符串。

答案 1 :(得分:2)

Wintermute在另一个answer中建议“无处不在”的解决方案。

仅Bash解决方案使用here-string代替 - 这是<<<符号:

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

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

答案 2 :(得分:2)

NUSER="${USER%%<!*}"

在这种情况下使用shell变量操作更快,打开子shell和sed操作(但这不是对请求使用sed的请求的确切回复)