将XML注释与awk匹配



为我的英语提前道歉:(

我目前正在做一个";bash脚本";对每个xml注释应用一种处理方法。它仍然是我,2〃;奇怪的";没有解决方案的问题哦!

所以。。。之前,我要疯了(regex引用/未引用>/斜杠/invar…我的疯^^)。我来这里寻求帮助:D

我尝试了几种模式,但未能找到匹配所有情况的模式。。。首先,我在这里收集了正则表达式所需的信息:XML注释。

[15]注释::='<!--'((Char-'-')|('-'(Char-'-'))*'->'

[2]字符::=#x9|#xA|#xD|[x20-#xD7FF]|[#xE000-#xFFFD]|[x10000-#xFFFF]

我已经"翻译";此发件人:

xmlSpaceCharSet=" rnt"

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

xmlCharCharSet1="$xmlSpaceCharSetx21-xD7FF\\\xE000-\\\xFFFD\\\x10000-\\\x10FFFF"

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

首先,经过一些测试,我找到了一种用unicode字符定义范围的方法,而不会在\\\x<hex_val>中出现awk故障。但有些量程只适用于一个,而不适用于\\\。此外,当范围必须以这样的一个开始时:x21,不需要逃离这样的结尾:\\\xD7FF。最后(facepalm),不可能这样定义范围:xFF-\\\xFFFF

Voodoo#1:

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

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

对于xmlCharCharSet0或xmlCharCharSet1相同的结果,除了没有";╔θ;字符;©"匹配。。。

Voodoo#2:

test.xml:

<!-- Unicode XML Comments

MultiLine

-->

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

如果xmlCharCharSet0或xmlCharCharSet1结果相同,除了没有之外没有匹配。。。

所以如果有人能帮我,一个解决方案,一些信息…:)我快疯了!^^=P

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

<!--

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

Date: all date/time format

Last Revision: all date/time format

Revision Code: [guid]

-->

感谢您所做的一切!

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

示例

数据.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
==================
-->

您可以尝试以下操作:

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)
}
}

CCD_ 25是您的输入文件。

我用这个文件试过了:

<!-- 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]
-->"

经过新的测试,我只能用一个括号范围来匹配新行。如果我在括号之前或之后添加一些字符,则正则表达式与新行不匹配。。。oOunicode字符没有进展。。。

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

最新更新