Bash:使用 sed 取消注释 XML 标记

use*_*811 3 bash awk sed xml-parsing

我当前有一个包含以下内容的文件:

<refrigerator>
    <food="watermelon" location="topShelf" />
    <!--
    <food="mango" location="bottomShelf" />
    --> 
    <!--
    <food="orange" location="middleShelf" />
    --> 
</refrigerator>
Run Code Online (Sandbox Code Playgroud)

我如何使用“sed”来删除<!---->取消注释“mango”?但是,如果文件中还有其他行被注释,我希望它们保持注释状态吗?

谢谢!

Gil*_*not 5

sed不是正确的工具(默认情况下不是多行),尝试使用,这更适合这种情况:

$ perl -i -0777 -pe 's/\s*<!--\s*\n(.*?food="mango".*?)\n\s*-->/\n$1/' file.txt
Run Code Online (Sandbox Code Playgroud)

输出

<refrigerator>
    <food="watermelon" location="topShelf" />
    <food="mango" location="bottomShelf" /> 
    <!--
    <food="orange" location="middleShelf" />
    --> 
</refrigerator>
Run Code Online (Sandbox Code Playgroud)

说明

  • -i切换就地编辑文件(就像sed -i
  • -0777一次性读取整个文件(也可以使用逐段-00读取)
  • -p假设“while (<>) { ... }”循环程序,并打印换行符
  • s///sed是类似替换的骨架
  • \s对于 Perl 来说是一个空白字符
  • .*?代表非贪婪匹配
  • $1与 sed 相同\1捕获的部分)

医生