提前抱歉我的英文:(
我目前正在开发一个“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]
-->
谢谢你的一切!
答案 0 :(得分:2)
像awk和sed这样的行编辑器是处理XML的糟糕选择。我建议使用xmllint,它可以使用XPath表达式来解析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]
-->"