从我的config.xml
文件的xml字符串中,我需要提取版本号的前三位数字:
<widget id="com.test.enterprise.test" version="3.0.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
我试过了:
cat config.xml | grep "<widget" | sed 's/[^0-9.]*\([0-9.]*\).*/\1/'
但这仅产生.
正确的正则表达式如何?
答案 0 :(得分:4)
不要使用正则表达式来解析XML。
xmllint -xpath 'string(//*[local-name()="widget"]/@version)' 1.xml \
| cut -f1-3 -d.
如果您还需要指定命名空间,请使用namespace-uri函数:
//*[local-name()="widget"][namespace-uri()="http://www.w3.org/ns/widgets"]
答案 1 :(得分:2)
支持PCRE的GNU grep \K
不包括&#39; \ K&#39;在结果
grep -Po '<widget.*?version="\K[^"]*' <<< '<widget id="com.test.enterprise.test" version="3.0.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">'
只有前3位
grep -Po '<widget.*?version="\K\d*(\.\d*){2}' <<< '<widget id="com.test.enterprise.test" version="3.0.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">'
答案 2 :(得分:1)
您只能在version="
substring:
cat config.xml | grep "<widget" | sed 's/.*version="\([0-9.]*\).*/\1/'
请参阅online demo
模式详情:
.*
- 任何0+字符version="
- version="
子字符串\([0-9.]*\)
- 捕获与零个或多个数字匹配的组#1或.
.*
- 任何0+字符。 \1
反向引用会在结果中保留第1组值。
答案 3 :(得分:1)
版本的前三位数字:
grep -oP 'widget.*version="\K\d+\.\d+\.\d+' xmlFile
3.0.0
答案 4 :(得分:1)
尝试关注问题,希望这也可以帮到你。
解决方案第一:使用awk的匹配功能。
if (isset($object->object2->property))
echo 'It exists!';
else
echo 'It does not exist!';
解决方案第二:逐个查看所有字段,然后检查其中的版本。
awk '{match($0,/version=\"[^"]*/);print substr($0,RSTART+9,RLENGTH-9)}' Input_file
解决方案第3条:将记录分隔符设置为空格和字段分隔符为(“)。
awk '{for(i=1;i<=NF;i++){if($i ~ /version/){gsub(/version=|\"/,"",$i);print $i;next}}}' Input_file
解决方案第四:简单地将所有文本替换为从开始到字符串版本=“然后再从”替换为“直到结束,这将仅保留输出中的版本号。
awk -v RS=" " -v FS="\"" '/^version/{print $2}' Input_file
我希望这会有所帮助。