2012-07-18 186 views
4

在bash腳本中,從字符串中提取文本模式的簡單方法是什麼?從字符串中提取模式

例如,我想提取X後跟兩個數字在字符串的末尾?

+1

[你有什麼試過](http://mattgemmell.com/2008/12/08/what-have-you-tried/)?告訴我們什麼壞了,我們會告訴你如何解決它。 – ghoti 2012-07-18 01:23:12

+1

學習sed和正則表達式。 – 2012-07-18 01:26:39

回答

4
$ foo="abcX23" 
$ echo "$(echo "$foo" | sed 's/.*\(X[0-9][0-9]\)$/\1/')" 
X23 

if [[ "$foo" =~ X[0-9][0-9]$ ]]; then 
    echo "${foo:$((${#foo}-3))}" 
fi 
+3

downvote沒有評論?我的答案如何錯誤或誤導? – ghoti 2012-07-18 13:19:25

18

有一個漂亮的正則表達式=~操作時使用double square brackets。被捕獲的組在$BASH_REMATCH陣列中可用。

if [[ $STRING =~ (X[0-9]{2})$ ]]; then 
    echo "matched part is ${BASH_REMATCH[1]}" 
fi 
+0

到目前爲止最簡單的解決方案!我只花了2個小時瞭解如何使用模式擴展,但它似乎有點奇怪!所以謝謝;) – HanniBaL90 2017-12-02 19:29:01

2

您還可以使用參數擴展:

V="abcX23" 
PREFIX=${V%%X[0-9][0-9]} # abc 
SUFFIX=${V:${#PREFIX}} # X23 
7

讓我們把你的輸入作爲

INPUT.TXT

ASD123 
GHG11D3456 
FFSD11dfGH 
FF87SD54HJ 

而且我想要找的模式「SD [數字] [數字]」

代碼

的grep -o 'SD [0-9] [0-9]' INPUT.TXT

輸出

SD12 
SD11 
SD54 

而如果你想在腳本中使用它...那麼你可以將上面的代碼分配給一個變量/數組......這是根據你的需要。

+0

** + 1 ** - 我忘了'grep -o'。好的建議,儘管根據OP的問題,我懷疑可以包括:'grep -o'X [0-9] [0-9] $'input.txt' – ghoti 2012-07-18 13:25:25