2010-07-23 53 views
24

我在外殼和我有這個字符串:12 BBQ ,45 rofl, 89 lol如何使用正則表達式和shell從字符串中提取值?

使用正則表達式:\d+ (?=rofl),我想45結果。

使用正則表達式從字符串中提取數據是否正確?我做的最好的是突出一些在線正則表達式編輯器的價值。大多數情況下,它會從我的字符串中刪除值。

我在調查expr,但我得到的只是語法錯誤。

我該如何設法在shell腳本中提取45個?

+1

你使用什麼工具,你用什麼殼,什麼是你使用的確切命令行的,什麼是錯誤,你得到了什麼? – Abel 2010-07-23 17:00:52

+0

恕我直言,爲此目的,使用正則表達式是完全可以接受的。 – 2010-07-23 16:52:13

回答

41

你可以用GNU的grep的perl的方式做到這一點:

echo "12 BBQ ,45 rofl, 89 lol"|grep -P '\d+ (?=rofl)' -o 

-P意味着Perl樣式,並-o只意味着比賽。

+0

是否有可能避免使用perl風格,因爲它從山獅之後的OS X中的grep中刪除? – AlexKorovyansky 2014-12-10 12:50:36

+0

OS X的可能替代/解決方法是使用gnu grep通過自制軟件,http://www.heystephenwood.com/2013/09/install-gnu-grep-on-mac-osx.html。 – AlexKorovyansky 2014-12-10 12:57:50

+0

我可以檢索碼頭集裝箱的端口號:D with'docker port c62c1c7b9efb | grep -P'(\ d +)$'-o' – 2016-09-28 21:16:26

8

看來你在問多個事情。要回答他們:

  • 是的,它是確定提取使用正則表達式從字符串數據,這是他們在做什麼有沒有
  • 你得到的錯誤,你用哪一個,什麼shell工具?
  • 您可以通過捕獲括號捕獲來提取數字:

    .*(\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

在你的例子中你不需要'。*'。如果你的正則表達式被錨定,你只需要那些邊緣。未固定的,它已經可以匹配字符串內的任何位置。 – Daenyth 2010-07-23 18:16:47

+0

OP要求只取出數字,不要做成功的比賽。通過添加'。*',這是一種簡單的方法來匹配所有內容,並替換匹配括號中的內容。沒有他們,字符串的其餘部分保持完好,這不是問(iiuc)。或者我錯過了什麼? – Abel 2010-07-23 18:29:40

+0

Woops,我錯過了你爲此使用'sed'。繼續。 – Daenyth 2010-07-24 18:09:05

-1

你當然可以提取字符串的一部分,這就是分析出的數據的好方法。正則表達式的語法差別很大,所以你需要引用你正在使用的正則表達式的幫助文件。您可以嘗試正則表達式,如:

[0-9]+ *[a-zA-Z]+,([0-9]+) *[a-zA-Z]+,[0-9]+ *[a-zA-Z]+ 

如果您正則表達式的程序可以做字符串替換,然後用您想要的結果整個字符串,你可以很容易地使用該結果。

你沒有提到你是否使用bash或其他shell。在尋求幫助時,這將有助於獲得更好的答案。

6

是的正則表達式當然可以用來提取字符串的一部分。不幸的是,不同版本的* nix和不同的工具使用的正則表達式略有不同。

這個sed命令應該在大多數的口味工作(測試OS/X和紅帽)

echo '12 BBQ ,45 rofl, 89 lol' | sed 's/^.*,\([0-9][0-9]*\).*$/\1/g' 
0

你可以使用shell(bash的舉例)

$ string="12 BBQ ,45 rofl, 89 lol" 
$ echo ${string% rofl*} 
12 BBQ ,45 
$ string=${string% rofl*} 
$ echo ${string##*,} 
45 
-1

您可以使用rextract來使用正則表達式提取並重新格式化結果。

例子:

[$] echo "12 BBQ ,45 rofl, 89 lol" | ./rextract '[,]([\d]+) rofl' '${1}' 
45 
+4

如果圖書館是你自己的(如「免責聲明:我製作了這個圖書館」),則需要添加免責聲明。從github看來,這個庫/可執行文件似乎是你自己的 – Justin 2016-09-13 04:02:04

相關問題