2015-11-30 88 views
2

我試圖從一組括號中讀取版本號之間進行讀,從這個輸出一些命令:SED或者grep的一組括號

Test Application version 1.3.5 

card 0: A version 0x1010000 (1.0.0), 20 ch 

Total known cards: 1 

我正在尋找獲得是1.0.0。 我試過sed和grep的變體:

command.sh | grep -o -P '(?<="(").*(?=")")' 

command.sh | sed -e 's/(\(.*\))/\1/' 

和大量的變化。 ?沒有運氣:-(

幫助

+1

歡迎來到SO!請添加一些代碼。 –

回答

3

你幾乎沒有在p纖ep,使用反斜槓保持括號的字面意思,而不是雙引號:

grep -o -P '(?<=\().*(?=\))' 
+0

Riiiight ..!當我懷念這些小東西時,我討厭它。乾杯。 –

0

有你也可以使用GNU的grep在perl的模式可用\K轉義序列:

grep -oP '\(\K[^)]+' 

\K刪除什麼迄今爲止已匹配。在這種情況下,起始(將從匹配中刪除。使用括號作爲分隔符

awk -F'[()]' 'NF>1{print $2}' 

命令拆分輸入行:

另外,您可以使用awk。一旦一行被分成多個字段(意思是找到括號),版本號就是第二個字段並被打印。


順便說一句,還有你的sed命令應該是:

sed -ne 's/.*(\(.*\)).*/\1/p' 
1

有一對夫婦的變化,將工作的。先用grepsed

grep '(' filename | sed 's/^.*[(]\(.*\)[)].*$/\1/' 

或短的shell腳本:

#!/bin/sh 

while read -r line; do 
    value=$(expr "$line" : ".*(\(.*\)).*") 
    if [ "x$value" != "x" ]; then 
     printf "%s\n" "$value" 
    fi 
done <"$1" 

無論你給定的輸入文件返回1.0.0

+0

'grep'可以很容易地被分解出來。只是在替換成功時將'sed'改爲只打印:'sed -n's /.*(\([^()] * \))。*/\ 1/p'filename' – tripleee

+0

Yes,I發現從hek2mgl的印刷模式空間的抑制。這是sed工具箱的一個。謝謝。 –