作者 | Shusain
譯者 | kimii
正則運算式(簡寫為 regex 或者 regexp)基本上是定義一種搜尋樣式的字串,可以被用來執行“搜尋”或者“搜尋並替換”操作,也可以被用來驗證像密碼策略等條件。
正則運算式是一個我們可利用的非常強大的工具,並且使用正則運算式的優點是它能在幾乎所有計算機語言中被使用。所以如果你使用 Bash 指令碼或者建立一個 python 程式時,我們可以使用正則運算式,或者也可以寫一個單行搜尋查詢。
在這篇教程中,我們將會學習一些正則運算式的基本概念,並且學習如何在 Bash 中透過 grep
使用它們,但是如果你希望在其他語言如 python 或者 C 中使用它們,你只能使用正則運算式部分。那麼讓我們透過正則運算式的一個例子開始吧,
正則運算式看起來像 /t[aeiou]l/
這個樣子。
但這是什麼意思呢?它意味著所提到的正則運算式將尋找一個詞,它以 t
開始,在中間包含字母 a e i o u
中任意一個,並且字母 l
最為最後一個字元。它可以是 tel
,tal
或者 til
,可以匹配一個單獨的詞或者其它單詞像 tilt
,brutal
或者 telephone
的一部分。
grep 使用正則運算式的語法是 $ grep "regex_search_term" file_location
如果不理解,不要擔心,這隻是一個例子,來展示可以利用正則運算式獲取什麼,相信我,這是最簡單的例子。我們可以從正則運算式中獲取更多。現在我們將從正則運算式基礎的開始。
基礎的正則表示式
現在我們開始學習一些被稱為元字元的特殊字元。它們可以幫助我們建立更複雜的正則運算式搜尋項。下麵提到的是基本元字元的串列,
.
點將匹配任意字元[ ]
將匹配一個字元範圍[^ ]
將匹配除了括號中提到的那個之外的所有字元*
將匹配零個或多個前面的項+
將匹配一個或多個前面的項?
將匹配零個或一個前面的項{n}
將匹配 n 次前面的項{n,}
將匹配 n 次或更多前面的項{n,m}
將匹配在 n 和 m 次之間的項{,m}
將匹配少於或等於 m 次的項\
是一個跳脫字元,當我們需要在我們的搜尋中包含一個元字元時使用現在我們將用例子討論所有這些元字元。
.
(點)
它用於匹配出現在我們搜尋項中的任意字元。舉個例子,我們可以使用點如:
$ grep "d.g" file1
這個正則運算式意味著我們在名為 ‘file1’ 的檔案中查詢的詞以 d
開始,以 g
結尾,中間可以有 1 個字元的字串。同樣,我們可以使用任意數量的點作為我們的搜尋樣式,如 T......h
,這個查詢項將查詢一個詞,以 T
開始,以 h
結尾,並且中間可以有任意 6 個字元。
[ ]
方括號用於定義字元範圍。例如,我們需要搜尋一些特別的單詞而不是匹配任何字元,
$ grep "N[oen]n" file2
這裡,我們正尋找一個單詞,以 N
開頭,以 n
結尾,並且中間只能有 o
、e
或者 n
中的一個。 在方括號中我們可以提到單個到任意數量的字元。
我們在方括號中也可以定義像 a-e
或者 1-18
作為匹配字元的串列。
[^ ]
這就像正則運算式的 not 操作。當使用 [^ ]
時,它意味著我們的搜尋將包括除了方括號內提到的所有字元。例如,
$ grep "St[^1-9]d" file3
這意味著我們可以擁有所有這樣的單詞,它們以 St
開始,以字母 d
結尾,並且不得包含從 1
到 9
的任何數字。
到現在為止,我們只使用了僅需要在中間查詢單個字元的正則運算式的例子,但是如果我們需要更多字元該怎麼辦呢。假設我們需要找到以一個字元開頭和結尾的所有單詞,並且在中間可以有任意數量的字元。這就是我們使用乘數元字元如 +
*
與 ?
的地方。
{n}
、{n,m}
、{n,}
或者 {,m}
也是可以在我們的正則運算式項中使用的其他乘數元字元。
*
(星號)
以下示例匹配字母 k
的任意出現次數,包括一次沒有:
$ grep "lak*" file4
它意味著我們可以匹配到 lake
、la
或者 lakkkk
。
+
以下樣式要求字串中的字母 k
至少被匹配到一次:
$ grep "lak+" file5
這裡 k
在我們的搜尋中至少需要發生一次,所以我們的結果可以為 lake
或者 lakkkk
,但不能是 la
。
?
在以下樣式匹配中
$ grep "ba?b" file6
匹配字串 bb
或 bab
,使用 ?
乘數,我們可以有一個或零個字元的出現。
非常重要的提示
當使用乘數時這是非常重要的,假設我們有一個正則運算式
$ grep "S.*l" file7
我們得到的結果是 small
、silly
,並且我們也得到了 Shane is a little to play ball
。但是為什麼我們得到了 Shane is a little to play ball
?我們只是在搜尋中尋找單詞,為什麼我們得到了整個句子作為我們的輸出。
這是因為它滿足我們的搜尋標準,它以字母 s
開頭,中間有任意數量的字元並以字母 l
結尾。那麼,我們可以做些什麼來糾正我們的正則運算式來只是得到單詞而不是整個句子作為我們的輸出。
我們在正則運算式中需要增加 ?
元字元,
$ grep "S.*?l" file7
這將會糾正我們正則運算式的行為。
\
\
是當我們需要包含一個元字元或者對正則運算式有特殊含義的字元的時候來使用。例如,我們需要找到所有以點結尾的單詞,所以我們可以使用:
$ grep "S.*\\." file8
這將會查詢和匹配所有以一個點字元結尾的詞。
透過這篇基本正則運算式教程,我們現在有一些關於正則運算式如何工作的基本概念。在我們的下一篇教程中,我們將學習一些高階的正則運算式的概念。同時盡可能多地練習,建立正則運算式並試著盡可能多的在你的工作中加入它們。如果有任何疑問或問題,您可以在下麵的評論區留言。
via: http://linuxtechlab.com/bash-scripting-learn-use-regex-basics/
作者:SHUSAIN[3] 譯者:kimii 校對:wxy
本文由 LCTT 原創編譯,Linux中國 榮譽推出