規定一些特殊語法表示字符類、數量限定符和位置關係,然後用這些特殊語法和普通字符一起表示一個模式,這就是正則表達式(Regular Expression)。
egrep:grep -E,表示採用Extended正則表達式語法。
fgrep:grep -F,表示只搜索固定字符串而不搜索正則表達式模式,不會按正則表達式的語法解釋後面的參數。
正則表達式參數用單引號括起來了,因爲正則表達式中用到的很多特殊字符在Shell中也有特殊含義(例如\),只有用單引號括起來才能保證這些字符原封不動地傳給grep命令,而不會被Shell解釋掉。
1.字符類
. 匹配除換行符以外的任意一個字符 如:abc. 結果爲 abcd, abc9
[m-n] 匹配[]中的一個字符,減號-表示範圍。數字或字符都可以。
[^xy] 匹配除x或y開頭的任一字符,如排除x1,y2
[[:xxx:]] 預定義的 [[:alpha:]]匹配一個字母,[[:digit:]]匹配一個數字
\w
匹配字母或數字或下劃線或漢字 [ a-z0-9A-Z_]
\s
匹配任意的空白符
\d
匹配數字 [0-9] \d不一定好使
\W
匹配任意不是字母,數字,下劃線,漢字的字符\S
匹配任意不是空白符的字符\D
匹配任意非數字的字符
2.數量限定符
x表示一個或多個字符或者一種模式 也可以理解爲重複前面的次數
x? x要匹配0或1次 Windows\d+
匹配Windows後面跟1個或更多數字 單詞 數字 0或1次
x+ x要匹配1或多次 ^\w+
匹配一行的第一個單詞(或整個字符串的第一個單詞
x* x要匹配0或多次
x{n} x要精確匹配n次
x{m,n} x匹配m到n次
x{m,} x至少匹配m次
x{,n} x最多匹配n次
3.位置限定符
^x 以x開頭的行 [
^x ]
匹配除了x以外的任意字符
x$ 以x結尾的行
^$ 空行
\<x 以x開頭的單詞
x\> 以x結尾的單詞
\bx或 x\b 匹配x開頭或x結尾的位置 \bat\b匹配... at ...,但不匹配cat、atexit、battry
\Bx或x\B 匹配非x開頭和x結尾的位置 \Bat\B匹配battery,但不匹配... attend、hat ...
\G
上一個匹配的結尾(本次匹配開始)
\A
字符串開頭(類似^
,但不受處理多行選項的影響)
\Z
字符串結尾或行尾(不受處理多行選項的影響)
\z
字符串結尾(類似$
,但不受處理多行選項的影響)
例子:
cat 1.txt
at
i am at home
cat
attend
whatis this
thisatthis
>>grep '\bat\b' 1.txt
at
i am at home
>>grep '\Bat\B' 1.txt
whatis this
thisatthis
4.其他
\ 轉義 比如\.
() 作爲一個整體
| 或 abc[d|f] 匹配abcd, abcf
字符轉義
grep -E '^([0-9]{1,3}\.)([0-9]{1,3}\.)([0-9]{1,3}\.)([0-9]{1,3})$' 1.txt
192.168.0.111
^ 限制開頭是3位 ,以防找出1192.168.xxx這種字符串
$ 限制末尾是3位, 以防找出xxx.168.xxx.1111這種字符串
---------------
0
[0-9]{2}-
[0-9]{8}|0
[0-9]{3}-
[0-9]{7}
這個表達式能匹配兩種以連字號分隔的電話號碼:一種是三位區號,8位本地號(如010-12345678),一種是4位區號,7位本地號(0376-2233445)。
\(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8} \d可換成
[0-9]
這個表達式匹配3位區號的電話號碼,其中區號可以用小括號括起來,也可以不用,區號與本地號間可以用連字號或空格間隔,也可以沒有間隔。
假設 file.txt 內容如下:
leecode題目
987-123-4567
123 456 7890
(123) 456-7890
你的腳本應當輸出下列有效的電話號碼:
987-123-4567
(123) 456-7890
grep -E '^((\([0-9]{3}\)\s)|([0-9]{3}-))[0-9]{3}-[0-9]{4}$' file.txt