2017-07-12 22 views
0

XML屬性從這個XML字符串從我​​3210文件中提取的版本號我需要提取的版本號的前三位:如何從使用bash

<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/' 

但這隻產生.如何正確的正則表達式看起來像?

回答

4

不要使用正則表達式解析XML。

xmllint -xpath 'string(//*[local-name()="widget"]/@version)' 1.xml \ 
| cut -f1-3 -d. 

如果需要指定命名空間,也使用命名空間URI功能:

//*[local-name()="widget"][namespace-uri()="http://www.w3.org/ns/widgets"] 
2

GNU的grep與PCRE支持\K的結果不包括左 '\ K' 的

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">' 
1

你可以抓住數字和點只有經過version="子:

cat config.xml | grep "<widget" | sed 's/.*version="\([0-9.]*\).*/\1/' 

online demo

圖案的詳細資料

  • .* - 任何0+字符
  • version=" - 一個version="
  • \([0-9.]*\) - 捕獲組#1匹配的零個或更多的數字或.
  • .* - 任何0+字符。

\1反向引用將保持結果中的第1組值。

1

對於版本的前三個數字:

grep -oP 'widget.*version="\K\d+\.\d+\.\d+' xmlFile 
3.0.0 
1

嘗試以下awks過,希望這可以幫助你。

解決方案1:使用awk的match函數。

awk '{match($0,/version=\"[^"]*/);print substr($0,RSTART+9,RLENGTH-9)}' Input_file 

解決第二:一個所有字段經歷一個,然後版本檢查它們。

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 

解決方案4:簡單地從開始直到字符串版本=「然後再次從代以」到年底爲止,這將保持在只輸出版本號替換所有文本。

awk '{sub(/.*version=\"/,"");sub(/\".*/,"");print}' Input_file 

我希望這會有所幫助。