2014-03-27 57 views
1

我想匹配具有小於或等於 2位數的字符串,但不大於 2位數字。如果數字不連續,它們可能總共超過2位數,但每個連續數字最多不得超過2個字母。BASH腳本正則表達式:小於或等於X位

所以,我想匹配像

 
42 
ABC92 
05XYZ 
ABC82XYZ 
()%^.90 XYZ 
AB 47.jpg 
3 
83abc29 
9abw88ak ak8+ 

但不

 
426 
ABC9242 
05697XYZ 
ABC8232XYZ 
()%^.9068 XYZ 
AB 479.jpg 
483 a8 

之前或之後的數字不僅可以字母表的字母,也任何字符字符串不是數字(在數字之前或之後沒有字母,而且這樣的字符串也應該匹配)。

.*[[:digit:]]{1,2}.*也匹配超過2位的字符串。這不是我想要的。

我該怎麼做?

+0

怎麼樣'ABC2dsd2'應該與之相匹配? – aelor

+0

@eelor對不起,應該匹配 – Naetmul

+0

@Naetmul請澄清。如果它應該匹配,即使不是連續的,就像在aelor指出的情況下一樣,你不應該從問題陳述中刪除「連續數字」這個短語嗎? – John1024

回答

5

僅使用bash。而不是試圖找到少於3個位數任何東西,發現無論3個位數以上相匹配,並且排除:

while read -r line; do 
    [[ "$line" =~ [[:digit:]][[:digit:]][[:digit:]] ]] || echo "$line" 
done << EOF 
42 
ABC92 
05XYZ 
ABC82XYZ 
()%^.90 XYZ 
AB 47.jpg 
426 
ABC9242 
05697XYZ 
ABC8232XYZ 
()%^.9068 XYZ 
AB 479.jpg 
EOF 

產地:

42 
ABC92 
05XYZ 
ABC82XYZ 
()%^.90 XYZ 
AB 47.jpg 

說明:binary operator =~認爲RHS作爲一個擴展的正表達。它匹配包含3位數字(或更多)的任何內容。所述||是短路操作者:

expression1 || expression2 

這意味着只有當expresssion1爲假該expression2被執行。

因此,僅打印不包含3個或更多連續數字的行。


您也可以使用grep使用標記啓用擴展正則表達式或PCRE:

grep -vE '[0-9]{3,}' inputfile 

grep -vP '[0-9]{3,}' inputfile 
+0

可否請你解釋一下代碼:) – aelor

+0

@aelor編輯答案解釋。 – devnull