我在外殼和我有這個字符串:12 BBQ ,45 rofl, 89 lol
如何使用正則表達式和shell從字符串中提取值?
使用正則表達式:\d+ (?=rofl)
,我想45
結果。
使用正則表達式從字符串中提取數據是否正確?我做的最好的是突出一些在線正則表達式編輯器的價值。大多數情況下,它會從我的字符串中刪除值。
我在調查expr
,但我得到的只是語法錯誤。
我該如何設法在shell腳本中提取45個?
我在外殼和我有這個字符串:12 BBQ ,45 rofl, 89 lol
如何使用正則表達式和shell從字符串中提取值?
使用正則表達式:\d+ (?=rofl)
,我想45
結果。
使用正則表達式從字符串中提取數據是否正確?我做的最好的是突出一些在線正則表達式編輯器的價值。大多數情況下,它會從我的字符串中刪除值。
我在調查expr
,但我得到的只是語法錯誤。
我該如何設法在shell腳本中提取45個?
你可以用GNU的grep的perl的方式做到這一點:
echo "12 BBQ ,45 rofl, 89 lol"|grep -P '\d+ (?=rofl)' -o
-P
意味着Perl樣式,並-o
只意味着比賽。
是否有可能避免使用perl風格,因爲它從山獅之後的OS X中的grep中刪除? – AlexKorovyansky 2014-12-10 12:50:36
OS X的可能替代/解決方法是使用gnu grep通過自制軟件,http://www.heystephenwood.com/2013/09/install-gnu-grep-on-mac-osx.html。 – AlexKorovyansky 2014-12-10 12:57:50
我可以檢索碼頭集裝箱的端口號:D with'docker port c62c1c7b9efb | grep -P'(\ d +)$'-o' – 2016-09-28 21:16:26
看來你在問多個事情。要回答他們:
您可以通過捕獲括號捕獲來提取數字:
.*(\d+) rofl.*
,並使用$1
得到串出(.*
是「之前和之後在同一行的其餘部分)
使用sed爲例,這個想法成爲這與只有匹配的編號替換所有字符串的文件:
sed -e 's/.*(\d+) rofl.*/$1/g' inputFileName > outputFileName
或:
echo "12 BBQ ,45 rofl, 89 lol" | sed -e 's/.*(\d+) rofl.*/$1/g'
你當然可以提取字符串的一部分,這就是分析出的數據的好方法。正則表達式的語法差別很大,所以你需要引用你正在使用的正則表達式的幫助文件。您可以嘗試正則表達式,如:
[0-9]+ *[a-zA-Z]+,([0-9]+) *[a-zA-Z]+,[0-9]+ *[a-zA-Z]+
如果您正則表達式的程序可以做字符串替換,然後用您想要的結果整個字符串,你可以很容易地使用該結果。
你沒有提到你是否使用bash或其他shell。在尋求幫助時,這將有助於獲得更好的答案。
是的正則表達式當然可以用來提取字符串的一部分。不幸的是,不同版本的* nix和不同的工具使用的正則表達式略有不同。
這個sed命令應該在大多數的口味工作(測試OS/X和紅帽)
echo '12 BBQ ,45 rofl, 89 lol' | sed 's/^.*,\([0-9][0-9]*\).*$/\1/g'
你可以使用shell(bash的舉例)
$ string="12 BBQ ,45 rofl, 89 lol"
$ echo ${string% rofl*}
12 BBQ ,45
$ string=${string% rofl*}
$ echo ${string##*,}
45
你使用什麼工具,你用什麼殼,什麼是你使用的確切命令行的,什麼是錯誤,你得到了什麼? – Abel 2010-07-23 17:00:52
恕我直言,爲此目的,使用正則表達式是完全可以接受的。 – 2010-07-23 16:52:13