我拼命地搜索以下:如何用sed搜索并替换这个字符串?
<texit info> author=MySelf title=MyTitle </texit>
,并用空白代替。
我到目前为止已经试过如下:
sed –I '1,5s/<texit//;s/info>//;s/author=MySelf//;s/title=MyTitle//' test.txt
但它不工作。
我拼命地搜索以下:如何用sed搜索并替换这个字符串?
<texit info> author=MySelf title=MyTitle </texit>
,并用空白代替。
我到目前为止已经试过如下:
sed –I '1,5s/<texit//;s/info>//;s/author=MySelf//;s/title=MyTitle//' test.txt
但它不工作。
不要用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=MySelf
,title=MyTitle
,但在离开收盘</texit>
任何多余的文字,就像你问的那样。如果你期望或希望它做不同的事情,你应该解释一下是什么。
sed 's/<texit\s\+info>\s*author=MySelf\s\+title=MyTitle\s*<\/texit>//g' test.txt
一般情况下不应使用正则表达式编辑XML的,但如果你只想要去除这些标签,上面会工作。您不需要多个s
命令,只需使用具有正确定义的空白的单个模式即可。
什么是“不起作用”?更具体地说,如果它的_did_按照预期工作,那么你的代码的输出是什么样的? – 2012-03-13 13:57:15