[英]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.