Sed:正则表达式匹配行,不带<!---->

时间:2010-04-05 17:28:04

标签: regex sed

我有一个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

3 个答案:

答案 0 :(得分:2)

这似乎有效。

^([ \t]*)(?!<!--)([0-9a-zA-Z<].*)$

为了让它与sed一起使用,你必须逃避麻痹和其他东西。

在在线regular expression tester中测试表达式。

不幸的是,似乎sed不支持前瞻(但是ssed does)。 你应该尝试awkssed

答案 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 

不像我希望的那样优雅,但却像魅力一样。