为我的英语提前道歉:(
我目前正在做一个";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]+"。