我有一个sed命令来注释掉xml命令
sed 's/^\([ \t]*\)\(.*[0-9a-zA-Z<].*\)$/\1<!-- Security: \2 -->/' web.xml
需要:
<a>
<!-- Comment -->
<b>
bla
</b>
</a>
产地:
<!-- Security: <a> -->
<!-- Security: <!-- Comment --> --> // NOTE: there are two end comments.
<!-- Security: <b> -->
<!-- Security: bla -->
<!-- Security: </b> -->
<!-- Security: </a> -->
理想情况下,我不想使用我的sed脚本来评论已经评论过的内容。
即:
<!-- Security: <a> -->
<!-- Comment -->
<!-- Security: <b> -->
<!-- Security: bla -->
<!-- Security: </b> -->
<!-- Security: </a> -->
我可以这样做:
sed 's/^\([ \t]*\)\(.*[0-9a-zA-Z<].*\)$/\1<!-- Security: \2 -->/' web.xml
sed 's/^[ \t]*<!-- Security: \(<!--.*-->\) -->/\1/' web.xml
但我认为一个班轮更清洁(?)
这非常相似:matching a line that doesn't contain specific text with regular expressions
答案 0 :(得分:2)
这似乎有效。
^([ \t]*)(?!<!--)([0-9a-zA-Z<].*)$
为了让它与sed一起使用,你必须逃避麻痹和其他东西。
在在线regular expression tester中测试表达式。
不幸的是,似乎sed不支持前瞻(但是ssed
does)。
你应该尝试awk
或ssed
。
答案 1 :(得分:1)
你可以使用awk,如果我的要求是正确的:
awk -F"," '!/<!--/&&NF{$0="<!-- Security: "$0"-->"}1' file
答案 2 :(得分:1)
结束了这个:
startInsert="<!-- Security: "
endInsert=" -->"
whiteSpace="[ \t]*"
char="[0-9a-zA-Z^_)!-/:-@[-\{-~]"
sed "s/^\($whiteSpace\)\(.*$char.*\)$/\1$startInsert\2$endInsert/" $file
sed "s/^\($whiteSpace\)$startInsert\(<!--.*\-->\)$endInsert/\1\2/" $file
不像我希望的那样优雅,但却像魅力一样。