如何用sed搜索和替换这个字符串?

时间:2012-03-13 13:41:03

标签: regex linux sed replace

我拼命想要搜索以下内容:

<texit info> author=MySelf title=MyTitle </texit>

并将其替换为空白。

到目前为止我尝试的是以下内容:

sed –I '1,5s/<texit//;s/info>//;s/author=MySelf//;s/title=MyTitle//' test.txt

但它不起作用。

2 个答案:

答案 0 :(得分:2)

不要使用sed编辑XML - 正确的工具类似于XMLStarlet,其行如下所示:

xmlstarlet ed -u //texit[@info] -v 'author=NewAuthor title=NewTitle'

...如果您的目标是更新代码中的文字。

正则表达式的表达力不足以正确处理XML(甚至正式 - 正则表达式在理论上足以解析常规语言; XML不是一种)。例如,您的原文与新行一样有效,如:

< texit
  info >author=MySelf title=MyTitle</texit>

...并且编写一个sed命令来处理这种情况并不好玩。另一方面,XML原生工具可以正确处理所有XML的极端情况。

那就是说,你给出的sed表达式确实“有效”,因为它完全按照它的写做。

sed -e '1,5s/<texit//;s/info>//;s/author=MySelf//;s/title=MyTitle//' \
  <<<"<texit info>author=MySelf title=MyTitle foo bar</texit>"

返回输出

   foo bar</texit>

正是所做的,因为它删除了<texit字符串,info>字符串,author=MySelftitle=MyTitle,但是就像你问的那样,留下结束</texit>和任何多余的文本。如果你期望或希望它做一些不同的事情,你应该解释它是什么。

答案 1 :(得分:2)

sed 's/<texit\s\+info>\s*author=MySelf\s\+title=MyTitle\s*<\/texit>//g' test.txt

您通常不应该使用正则表达式编辑XML,但如果您只想剥离这些标记,则上述操作将起作用。您不需要多个s命令,只需使用具有正确定义的空格的单个模式。