如何使用bash从xml属性中提取版本号

时间:2017-07-12 12:40:56

标签: regex bash sed

从我的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/'

但这仅产生.正确的正则表达式如何?

5 个答案:

答案 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

我希望这会有所帮助。