我拼命想要搜索以下内容:
<texit info> author=MySelf title=MyTitle </texit>
并将其替换为空白。
到目前为止我尝试的是以下内容:
sed –I '1,5s/<texit//;s/info>//;s/author=MySelf//;s/title=MyTitle//' test.txt
但它不起作用。
答案 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=MySelf
,title=MyTitle
,但是就像你问的那样,留下结束</texit>
和任何多余的文本。如果你期望或希望它做一些不同的事情,你应该解释它是什么。
答案 1 :(得分:2)
sed 's/<texit\s\+info>\s*author=MySelf\s\+title=MyTitle\s*<\/texit>//g' test.txt
您通常不应该使用正则表达式编辑XML,但如果您只想剥离这些标记,则上述操作将起作用。您不需要多个s
命令,只需使用具有正确定义的空格的单个模式。