关于在sed问题中使用引用

时间:2011-07-19 08:48:39

标签: bash

好。感谢您的亲切帮助。我已经从中了解到,要在sed中使用变量,我们必须使用“”而不是“”。但是,在我的情况下,在使用''而没有变量之前,它运作良好。使用“”和变量($ title,$ web,$ desc)之后它不再起作用了,原因是什么?感谢。

sed -i '0,/<item pop="N">/ { s/<item pop="N">/<item pop="N">\n <title>test1<\/title>\n <guid>test2<\/guid>\n <link>test3<\/link>\n <description><![CDATA[<p>test4<\/p>]]><\/description>\n <\/item>\n<item pop="N">/ }' /var/www/html/INFOSEC/english/rss/test.xml

sed -i "0,/<item pop="N">/ { s/<item pop="N">/<item pop="N">\n <title>News: $title<\/title>\n <guid>$web<\/guid>\n <link>$web<\/link>\n <description><![CDATA[<p>$desc<\/p>]]><\/description>\n <\/item>\n<item pop="N">/ }" /var/www/html/INFOSEC/english/rss/test.xml

我已经单独运行它而不是整个脚本 结果是错误-bash:![CDATA [:事件未找到,实际上我不应单独运行,因为我需要在变量中输入内容

3 个答案:

答案 0 :(得分:2)

切换它们。只要引用的部分是连续的,bash就会将它们视为一个字符串。

sed -i '0,/<item pop="N">/ { s/<item pop="N">/<item pop="N">\n <title>News: '"$title"'<\/title>\n <guid>'"$web"'<\/guid>\n <link>'"$web"'<\/link>\n <description><![CDATA[<p>'"$desc"'<\/p>]]><\/description>\n <\/item>\n<item pop="N">/ }' /var/www/html/INFOSEC/english/rss/test.xml

答案 1 :(得分:2)

您在字符串中使用"。这些字符需要转义。

此外,您的shell可能会转义\内的""个字符,而不是''内的""字符。您至少有两个解决方案:

将所有内容保留在\内,但将\\替换为",将\"替换为 sed -i "0,/<item pop=\"N\">/ { s/<item pop=\"N\">/<item pop=\"N\">\\n <title>News: $title<...

'

或者将两者混合;当您需要插入变量时,请退出"",在'中输入您的变量,然后重新输入 sed -i '0,/<item pop="N">/ { s/<item pop="N">/<item pop="N">\n <title>News: '"$title"'<...

{{1}}

答案 2 :(得分:0)

当shell在双引号内看到!时,会触发Bash history expansion。这就是未找到&#34;事件的原因&#34;出现错误消息。从手册:

  

只能使用'\'和'&#39;'来转义历史记录扩展字符。

你可以这样做:

sed_script='0,/<item pop="N">/ { s/<item pop="N">/<item pop="N">\n <title>News: %s<\/title>\n <guid>%s<\/guid>\n <link>%s<\/link>\n <description><![CDATA[<p>%s<\/p>]]><\/description>\n <\/item>\n<item pop="N">/ }'
sed -i "$(printf "$sed_script" "$title" "$web" "$web" "$desc")" /var/www/html/INFOSEC/english/rss/test.xml

或者(我不是sed专家),这是否有效?它更具可读性

sed_script='/<item pop="N">/ a \
<title>News: %s</title> \
<guid>%s</guid>\n <link>%s</link> \
<description><![CDATA[<p>%s</p>]]></description> \
</item> \
<item pop="N">'
sed -i "$(printf "$sed_script" "$title" "$web" "$web" "$desc")" /var/www/html/INFOSEC/english/rss/test.xml