Linux中國

Bash 腳本:正則表達式基礎篇

正則表達式是一個我們可利用的非常強大的工具,並且使用正則表達式的優點是它能在幾乎所有計算機語言中被使用。所以如果你使用 Bash 腳本或者創建一個 python 程序時,我們可以使用正則表達式,或者也可以寫一個單行搜索查詢。

在這篇教程中,我們將會學習一些正則表達式的基本概念,並且學習如何在 Bash 中通過 grep 使用它們,但是如果你希望在其他語言如 python 或者 C 中使用它們,你只能使用正則表達式部分。那麼讓我們通過正則表達式的一個例子開始吧,

正則表達式看起來像 /t[aeiou]l/ 這個樣子。

但這是什麼意思呢?它意味著所提到的正則表達式將尋找一個詞,它以 t 開始,在中間包含字母 a e i o u 中任意一個,並且字母 l 最為最後一個字元。它可以是 teltal 或者 til,可以匹配一個單獨的詞或者其它單詞像 tiltbrutal 或者 telephone 的一部分。

grep 使用正則表達式的語法是 $ grep "regex_search_term" file_location

如果不理解,不要擔心,這只是一個例子,來展示可以利用正則表達式獲取什麼,相信我,這是最簡單的例子。我們可以從正則表達式中獲取更多。現在我們將從正則表達式基礎的開始。

基礎的正則表示式

現在我們開始學習一些被稱為 元字元 MetaCharacters 的特殊字元。它們可以幫助我們創建更複雜的正則表達式搜索項。下面提到的是基本元字元的列表,

  • . 點將匹配任意字元
  • [ ] 將匹配一個字元範圍
  • [^ ] 將匹配除了括弧中提到的那個之外的所有字元
  • * 將匹配零個或多個前面的項
  • + 將匹配一個或多個前面的項
  • ? 將匹配零個或一個前面的項
  • {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 結尾,並且中間只能有 oe 或者 n 中的一個。 在方括弧中我們可以提到單個到任意數量的字元。

我們在方括弧中也可以定義像 a-e或者 1-18 作為匹配字元的列表。

[^ ]

這就像正則表達式的 not 操作。當使用 [^ ] 時,它意味著我們的搜索將包括除了方括弧內提到的所有字元。例如,

$ grep "St[^1-9]d" file3

這意味著我們可以擁有所有這樣的單詞,它們以 St 開始,以字母 d 結尾,並且不得包含從 19 的任何數字。

到現在為止,我們只使用了僅需要在中間查找單個字元的正則表達式的例子,但是如果我們需要更多字元該怎麼辦呢。假設我們需要找到以一個字元開頭和結尾的所有單詞,並且在中間可以有任意數量的字元。這就是我們使用乘數元字元如 + *? 的地方。

{n}{n,m}{n,} 或者 {,m} 也是可以在我們的正則表達式項中使用的其他乘數元字元。

* (星號)

以下示例匹配字母 k 的任意出現次數,包括一次沒有:

$ grep "lak*" file4

它意味著我們可以匹配到 lakela 或者 lakkkk

+

以下模式要求字元串中的字母 k 至少被匹配到一次:

$ grep "lak+" file5

這裡 k 在我們的搜索中至少需要發生一次,所以我們的結果可以為 lake 或者 lakkkk,但不能是 la

?

在以下模式匹配中

$ grep "ba?b" file6

匹配字元串 bbbab,使用 ? 乘數,我們可以有一個或零個字元的出現。

非常重要的提示

當使用乘數時這是非常重要的,假設我們有一個正則表達式

$ grep "S.*l" file7

我們得到的結果是 smallsilly,並且我們也得到了 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 譯者:kimii 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國