2012-03-13 59 views
0

我拼命地搜索以下:如何用sed搜索并替换这个字符串?

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

,并用空白代替。

我到目前为止已经试过如下:

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

但它不工作。

+2

什么是“不起作用”?更具体地说,如果它的_did_按照预期工作,那么你的代码的输出是什么样的? – 2012-03-13 13:57:15

回答

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>任何多余的文字,就像你问的那样。如果你期望或希望它做不同的事情,你应该解释一下是什么。

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

一般情况下不应使用正则表达式编辑XML的,但如果你只想要去除这些标签,上面会工作。您不需要多个s命令,只需使用具有正确定义的空白的单个模式即可。