2017-04-13 13 views
0
/[SELECT]{6}[ ]{0,50}[@clnt_id_n]{10}[ \t]{0,50}[=]{1}[ \t]{0,50}[0-9]{2,10}/g 

上述正則表達式的工作好下面的regexr.com正則表達式匹配的regexr.com但不是在根除牛瘟(bash)的

SELECT @clnt_id_n    = 38404 

但是它似乎並沒有當我使用工作它使用grep如下:

egrep "[SELECT]{6}[ ]{0,50}[@clnt_id_n]{10}[ \t]{0,50}[=]{1}[ \t]{0,50}[0-9]{2,10}" filename 
+0

'egpre'是'grep'的擴展版本,它們並不相似 –

+0

[看這裏](http://unix.stackexchange.com/questions/17949/what-is-the-difference-between-grep- egrep-and-fgrep) –

+4

你的正則表達式似乎是錯誤的。 ''[SELECT] {6}'只是說你需要S,E,L,C和T字母表中的6個字母,它與SELECT匹配,但也匹配TECLES和EEEEEE等等,這可能是你不想要的東西。 – vdavid

回答

6

[SELECT] {6}匹配 「SELECT」,而且 「ELSLET」 或6 C,E,L的任意組合,S,T。 要僅匹配「SELECT」,只需使用「SELECT」。

要匹配你寫考慮使用測試線:

grep -E "SELECT\[email protected]_id_n\s*=\s*[1-9]+[0-9]*" 

「\ s」的任何空白字符,如空格和製表符匹配。 '+'表示1或更多,'*'表示0或更多。

請注意,上述正則表達式假設上的「=」右邊的數字不能以0

+1

Just注意:OP在'='周圍不允許有空格。 (他使用'{0,50}')。所以,最好使用'\ s * = \ s *'而不是'\ s + = \ s +'。 – jm666

+0

@ jm666你是對的 – silel

+3

@silel:做得很好,但一個狡辯:'egrep'是(a)[obsolescent](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/grep.html)和(b)實際上只是'grep -E'的別名,所以'grep'標籤是完全正確的。我建議從您的答案中刪除評論,並使用'grep -E'代替。 – mklement0

1

這開始是除了@ silel的很好的答案。請注意0​​與egrep相同。

echo grep -E 
grep -E '^\s*SELECT\[email protected]_id_n\s*=\s*[0-9]+\s*$' <<EOF2 
SELECT @clnt_id_n    = 38404 
ELECTS @clnt_id_n    = 38404 
SELECT @clnt_id_n=38404 
XSELECT @clnt_id_n=38404 
SELECT @clnt_id_n=xxx 
EOF2 

#If your `grep` knows the `-P` option, then you could shorten even more: 

echo grep -P 
grep -P '^\s*SELECT\[email protected]_id_n\s*=\s*\d+\s*$' <<EOF 
SELECT @clnt_id_n    = 38404 
ELECTS @clnt_id_n    = 38404 
SELECT @clnt_id_n=38404 
XSELECT @clnt_id_n=38404 
SELECT @clnt_id_n=xxx 
EOF 

上面打印:

grep -E 
SELECT @clnt_id_n    = 38404 
SELECT @clnt_id_n=38404 
grep -P 
SELECT @clnt_id_n    = 38404 
SELECT @clnt_id_n=38404 

我停住了正則表達式,以飽滿的線條(但允許空間無處不在)。如果這是不希望的,請從上面刪除^\s*\s*$

相關問題