簡體   English   中英

bash:sed正則表達式忽略字符串

[英]bash: sed regex ignoring string

我有2種可能的文字之一:

 myProg vFOO 3.1.2.11.1+build4 (Build time: Aug  7 2014 15:33:58)
 myProg v3.1.2.11.1+build4 (Build time: Aug  7 2014 15:33:58)

如何忽略sed正則表達式中的整個“ FOO”字符串? 因此它將打印:

 v3.1.2.11.1+build4

我正在使用:

 sed -n '/myProg v/s/.*myProg v["FOO "]\([[:alnum:][:punct:]]*\).*/v\1/gp'

謝謝

您根本不需要sed ;僅在一行中運行時,僅使用bash內置函數比運行外部程序並讀取其輸出快得多。

s='myProg vFOO 3.1.2.11.1+build4 (Build time: Aug  7 2014 15:33:58)'
[[ $s = *" vFOO "* ]] && s=${s//vFOO /v}
[[ $s =~ (v[[:alnum:]][^[:space:]]+) ]] && echo "${BASH_REMATCH[1]}"

...發出...

v3.1.2.11.1+build4

您在使用方括號進行分組時犯了一個非常普遍的錯誤。 他們不是那樣做的。 他們創建一個角色類。 您正在尋找規則的圓括號(在sed的方言中顯然需要用反斜杠引號):

sed -n 's/.*myProg v\(FOO \)\?\([[:alnum:][:punct:]]*\).*/v\2/p'

您最初使用的/myProg v/雖然有很好的意圖,但實際上並沒有達到有用的目的。 無論如何,以上腳本只會打印替換成功的行。

(您擁有的/g標志根本沒有用,因為在輸入行中只會有一個匹配項。)

這是假設您的sed接受\\? 表示“零或一重復”。 如果不是,您可以稍微不精確但可以安全地交易*通配符。

grep怎么樣:

grep -Po 'myProg v\D*\K[\d.]*'

build...信息:

grep -Po 'myProg v\D*\K\S*' 

與您的文字:

kent$ echo "myProg vFOO 3.1.2.11.1+build4 (Build time: Aug  7 2014 15:33:58)
 myProg v3.1.2.11.1+build4 (Build time: Aug  7 2014 15:33:58)"|grep -Po 'myProg v\D*\K[\d.]*'
3.1.2.11.1
3.1.2.11.1

kent$ echo "myProg vFOO 3.1.2.11.1+build4 (Build time: Aug  7 2014 15:33:58)
 myProg v3.1.2.11.1+build4 (Build time: Aug  7 2014 15:33:58)"|grep -Po 'myProg v\D*\K\S*'   
3.1.2.11.1+build4
3.1.2.11.1+build4

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM