使用awk匹配XML注释

时间:2013-12-25 16:46:31

标签: xml regex bash unicode awk

提前抱歉我的英文:(

我目前正在开发一个“bash脚本”,它为每个xml注释应用一种处理方法。 它仍然是我,没有解决方案的2个“奇怪”问题oO!

  

所以...之前,我要疯了正则表达式引用 / 未加引号 / slashed / invar ...我的疯狂^^)。我来这里是为了得到帮助:D

我尝试了几种模式,但我找不到符合所有情况的模式...... 首先,我在这里收集正则表达式所需的信息:XML Comments

  

[15]评论:: ='<! - '((Char - ' - ')|(' - '(Char - ' - ')))*' - >'

     
    

[2] Char :: =#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]

  

我通过以下方式“翻译”:

  

xmlSpaceCharSet=" \r\n\t"

     

xmlCharCharSet0="$xmlSpaceCharSet\x21-\x218F\\\\\\\x2C00-\\\\\\\xD7FF\\\\\\\xE000-\\\\\\\xFFFD\\\\\\\x10000-\\\\\\\x10FFFF"

     

xmlCharCharSet1="$xmlSpaceCharSet\x21-\xD7FF\\\\\\\xE000-\\\\\\\xFFFD\\\\\\\x10000-\\\\\\\x10FFFF"

     

xmlCommentPattern="<!--[^-][$xmlCharCharSet]*-->"

     

首先,在经过一些测试之后,我找到了一种方法来定义具有unicode字符的范围而不使用\\\\\\\x<hex_val>的awk失败。但某些范围只能使用一个\,但不适用于\\\\\\\。此外,当范围必须从一个\开始,如下所示:\x21,不需要像这样逃避结尾:\\\\\\\xD7FF。最后(facepalm),不可能像这样定义范围:\xFF-\\\\\\\xFFFF ...

巫毒教徒#1:

  

的test.xml:   <!-- Unicode XML Comments-[©╔ΘϘϖ] -->

     

test.sh:   echo "$(<$1)" | awk -v regexPattern="$xmlCommentPattern" '$0 ~ regexPattern'

     

xmlCharCharSet0或xmlCharCharSet1 结果相同,除了“╔ΘϘπ”字符外没有匹配,“©”匹配 ......

巫毒教会#2:

  

的test.xml:

     

<!-- Unicode XML Comments

     

MultiLine

     

-->

     

test.sh:   echo "$(<$1)" | awk -v regexPattern="$xmlCommentPattern" '$0 ~ regexPattern'

     

xmlCharCharSet0或xmlCharCharSet1 结果相同,不匹配,除非\ n ......

所以,如果有人可以帮助我,解决方案,一些信息... :)我会疯了! ^^ = P

我需要找到的标题示例&amp;检查:

  

<!--

     

User: all alpha format (latin, chinese, japan, ...)

     

Date: all date/time format

     

Last Revision: all date/time format

     

Revision Code: [guid]

     

-->

谢谢你的一切!

3 个答案:

答案 0 :(得分:2)

像awk和sed这样的行编辑器是处理XML的糟糕选择。我建议使用xmllint,它可以使用XPath表达式来解析XML文档。

实施例

data.xml中

<data>
  <!--
  ==================
  First row
  Mulit-line comment
  ==================
  -->
  <row>
    <col1>one</col1>
    <col2>two</col2>
    <col3>three</col3>
  </row>
  <!--
  ==================
  Second row
  Mulit-line comment
  ==================
  -->
  <row>
    <col1>une</col1>
    <col2>duex</col2>
    <col3>trois</col3>
  </row>
</data>

检索评论

使用Xpath表达式检索第一条评论:

$ xmllint --xpath "/data/comment()[1]" data.xml
<!--
  ==================
  First row
  Mulit-line comment
  ==================
  -->

同样适用于第二条评论

$ xmllint --xpath "/data/comment()[2]" data.xml
<!--
  ==================
  Second row
  Mulit-line comment
  ==================
  -->

答案 1 :(得分:0)

经过新测试后,我只能将新线与一个支架范围匹配。如果我在括号之前或之后添加一些字符,则正则表达式与新行不匹配... oO unicode字符没有进展......

用于匹配新行的模式:“[a-zA-Z0-9 \ n] +”。

答案 2 :(得分:0)

您可以尝试以下操作:

awk -f c.awk test.xml

其中c.awk是:

{
    line=line $0 RS
}
END {
    regex="<!--(.|(.?(-[^>]|[^-][^>]|[^-]>)*))->"
    while (match(line,regex)) {
        print ++i ": \"" substr(line,RSTART,RLENGTH) "\""
        line=substr(line,RSTART+RLENGTH)
    }
}

test.xml是您输入的文件。

我用这个文件试了一下:

<!-- Unicode XML Comments-[©╔ΘϘϖ] -->
<!-- Unicode XML Comments

MultiLine

-->
aa


    <!--

    User: all alpha format (latin, chinese, japan, ...)

    Date: all date/time format

    Last Revision: all date/time format

    Revision Code: [guid]

    -->

带输出:

1: "<!-- Unicode XML Comments-[©╔ΘϘϖ] -->"
2: "<!-- Unicode XML Comments

MultiLine

-->"
3: "<!--

    User: all alpha format (latin, chinese, japan, ...)

    Date: all date/time format

    Last Revision: all date/time format

    Revision Code: [guid]

    -->"