正規表示式(regular expression):規定一些特殊語法表示字元類、數量限定符和位置關係,然後用這些特殊語法和普通字元一起表示乙個模式
例如:email位址的正規表示式可以寫成[a-za-z0-9_.-]+@[a-za-z0-9_.-]+\.[a-za-z0-9_.-]+
ip位址的正規表示式可以寫成[0-9]\.[0-9]\.[0-9]\.[0-9]
192.168.1.11234.234.04.5678
123.4234.045.678
abcde
$ egrep '[0-9]\.[0-9]\.[0-9]\.[0-9]' testfile192.168.1.1
1234.234.04.5678
egrep
相當於grep -e
,表示採用extended正規表示式語法。grep
的正規表示式有basic和extended兩種規範,它們之間的區別下一節再解釋。另外還有fgrep
命令,相當於grep -f
,表示只搜尋固定字串而不搜尋正規表示式模式,不會按正規表示式的語法解釋後面的引數。
注意正規表示式引數用單引號括起來了,因為正規表示式中用到的很多特殊字元在shell中也有特殊含義(例如\),只有用單引號括起來才能保證這些字元原封不動地傳給grep
命令,而不會被shell解釋掉。
本節介紹egrep(1)
所使用的正規表示式,它大致上符合posix正規表示式規範。
字元類字元
含義舉例
.
匹配任意乙個字元
abc.
可以匹配abcd
、abc9
等
匹配括號中的任意乙個字元
[abc]d
可以匹配ad
、bd
或cd
-
在括號內表示字元範圍
[0-9a-fa-f]
可以匹配一位十六進製制數字
^
位於括號內的開頭,匹配除括號中的字元之外的任意乙個字元
[^xy]
匹配除xy
之外的任一字元,因此[^xy]1
可以匹配a1
、b1
但不匹配x1
、y1
[[:***:]]
grep
工具預定義的一些命名字元類
[[:alpha:]]
匹配乙個字母,[[:digit:]]
匹配乙個數字
數量限定符字元
含義舉例
?
緊跟在它前面的單元應匹配零次或一次
[0-9]?\.[0-9]
匹配0.0
、2.3
、.5
等,由於.
在正規表示式中是乙個特殊字元,所以需要用\
轉義一下,取字面值
+
緊跟在它前面的單元應匹配一次或多次
[a-za-z0-9_.-]+@[a-za-z0-9_.-]+\.[a-za-z0-9_.-]+
匹配email位址
*
緊跟在它前面的單元應匹配零次或多次
[0-9][0-9]*
匹配至少一位數字,等價於[0-9]+
,[a-za-z_]+[a-za-z_0-9]*
匹配c語言的識別符號
緊跟在它前面的單元應精確匹配
n次
[1-9][0-9]
匹配從100
到999
的整數
緊跟在它前面的單元應匹配至少
n
次
[1-9][0-9]
匹配三位以上(含三位)的整數
緊跟在它前面的單元應匹配最多
m
次
[0-9]
相當於[0-9]?
緊跟在它前面的單元應匹配至少
n
次,最多m
次
[0-9]\.[0-9]\.[0-9]\.[0-9]
匹配ip位址
注意grep
找的是包含某一模式的行,而不是完全匹配某一模式的行。再舉個例子,如果文字檔案的內容是
aaabc查詢aadefg
a*
這個模式的結果是三行都被找出來了
$ egrep 'a*' testfileaabc
aadefg
a*
匹配0個或多個a
,而第三行包含0個a
,所以也包含了這一模式。單獨用a*
這樣的正規表示式做查詢沒什麼意義,一般是把a*
作為正規表示式的一部分來用。
位置限定符
字元含義
舉例^
匹配行首的位置
^content
匹配位於一行開頭的content
$
匹配行末的位置
;$
匹配位於一行結尾的;
號,^$
匹配空行
\<
匹配單詞開頭的位置
\
\>匹配單詞結尾的位置
p\>
匹配leap ...
,但不匹配parent
、sleepy
\b
匹配單詞開頭或結尾的位置
\bat\b
匹配... at ...
,但不匹配cat
、atexit
、batch
\b
匹配非單詞開頭和結尾的位置
\bat\b
匹配battery
,但不匹配... attend
、hat ...
位置限定符可以幫助grep
更準確地查詢,例如上一節我們用[0-9]\.[0-9]\.[0-9]\.[0-9]
查詢ip位址,找到這兩行
192.168.1.1如果用1234.234.04.5678
^[0-9]\.[0-9]\.[0-9]\.[0-9]$
查詢,就可以把1234.234.04.5678
這一行過濾掉了。
其它特殊字元
字元含義
舉例\
轉義字元,普通字元轉義為特殊字元,特殊字元轉義為普通字元
普通字元<
寫成\<
表示單詞開頭的位置,特殊字元.
寫成\.
以及\
寫成\\
就當作普通字元來匹配
()
將正規表示式的一部分括起來組成乙個單元,可以對整個單元使用數量限定符
([0-9]\.)[0-9]
匹配ip位址
|
連線兩個子表示式,表示或的關係
n(o|either)
匹配no
或neither
正規表示式 正規表示式 總結
非負整數 d 正整數 0 9 1 9 0 9 非正整數 d 0 負整數 0 9 1 9 0 9 整數 d 非負浮點數 d d 正浮點數 0 9 0 9 1 9 0 9 0 9 1 9 0 9 0 9 0 9 1 9 0 9 非正浮點數 d d 0 0 負浮點數 正浮點數正則式 英文本串 a za z...
正規表示式 表示式
網域名稱 a za z0 9 a za z0 9 a za z0 9 a za z0 9 interneturl a za z s 或 http w w w 手機號碼 13 0 9 14 5 7 15 0 1 2 3 5 6 7 8 9 18 0 1 2 3 5 6 7 8 9 d 號碼 x x x...
Linux正規表示式 編寫正規表示式
為了所有實用化的用途,你可以通過使用程式產生正確的結果。然而,並不意味著程式總是如你所願的那樣正確地工作。多數情況下,如果程式不能產生想要的輸出,可以斷定真正的問題 排除輸入或語法錯誤 在於如何描述想要的東西。換句話說,應該考慮糾正問題的地方是描述想要的結果的表示式。表示式不完整或者公式表示得不正確...