正則表達式基礎

語法格式

[:alnum:]代表英文大小寫字母及數字 
[:alpha:]代表英文大小寫字母
[:blank:]代表空格和 tab 鍵
[:cntrl:]鍵盤上的控制按鍵,如 CR,LF,TAB,DEL
[:digit:]代表數字
[:graph:]代表空白字符以外的其他
[:lower:]小寫字母
[:print:]可以被打印出來的任何字符
[:punct:]代表標點符號
[:upper:]代表大寫字符
[:space:]任何會產生空白的字符如空格,tab,CR 等
[:xdigit:]代表 16 進位的數字類型

查找小寫字母:

$ grep -n '[[:lower:]]' regular_express.txt

查找數字:

$ grep -n '[[:digit:]]' regular_express.txt

簡單例子 :ls 命令正則表達式應用

命令中‘ * ’號是正則表達式的一種,代表任意字符串。

$ ls
$ ls a*   //打印出以 a 開頭的文件及內容或者目錄
$ ls *s   //打印以 s 結尾的文件及內容或者目錄
$ ls Pub* // Public 文件爲空,所有沒有打印任何內容
$ ls e*   //沒有以 e 開頭的文件,所有顯示沒有找到匹配項

grep 命令與正則表達式

參數說明:

-a :將 binary 檔案以 text 檔案的方式搜尋數據

-c :計算找到 ‘搜尋字符串’ 的次數

-i :忽略大小寫的不同,所以大小寫視爲相同

-n :順便輸出行號

-v :反向選擇,亦即顯示出沒有 ‘搜尋字符串’ 內容的那一行!

搜尋特定字符串”the”

$ grep -n 'the' regular_express.txt
$ grep -in 'the' regular_express.txt

字符組匹配

[]中包含的任意一個字符。只能是一個。

字符組支持由連字符“ - ”來表示一個範圍。當“ - ”前後構成範圍時,要求前面字符的碼位小於後面字符的碼位。

[^…] 排除型字符組。排除後面的字符。

[abc]           :表示“a”或“b”或“c”
[0-9]           :表示 0~9 中任意一個數字,等價於[0123456789]
[\u4e00-\u9fa5] :表示任意一個漢字
[^a1<]          :表示除“a”、“1”、“<”外的其它任意一個字符
[^a-z]          :表示除小寫字母外的任意一個字符

//查找“tast”或者“test”兩個字符串。
# grep -n 't[ae]st' regular_express.txt 
# grep -n '[^#]' regular_express.txt

行首符: ^ 與行尾符: $

在第一個小實驗中,查找了一行字符中含有“the”的,如果你想要只查找 行首爲“the”的字符行,則使用以下命令:

 $ grep -n '^the' regular_express.txt

查找行首爲大寫字母的所有行:

‘^[A-Z]’ 表示以大寫字母開頭。

‘[^A-Z]’ 表示除了大寫字母 A-Z 的所有字符。

$ grep -n '^[A-Z]' regular_express.txt

查找以 d 字母結尾的行:

$ grep -n 'd$' regular_express.txt

查找空行:

$ grep -n '^$' regular_express.txt

任意一個字符: ” . “(小數點)與重複字符 “ * ”(星號) 。

查找 a?ou?類型的字符

$ grep -n 'a.ou.' regular_express.txt

‘a.ou.’ : 小數點表示任意一個字符,一個小數點只能表示一個未知字符。

*(星號):代表重複前面 0 個或者多個字符。
e*: 表示具有空字符或者一個以上 e 字符。
ee* : 表示前面的第一個 e 字符必須存在。第二個 e 則可以是 0 個或者多個 e 字符。
eee* : 表示前面兩個 e 字符必須存在。第三個 e 則可以是 0 個或者多個 e 字符。
ee*e :表示前面的第一個與第三個 e 字符必須存在。第二個 e 則可以是 0 個或者多個 e 字符。

限定連續字符範圍{ }:

{ }可限制一個範圍區間內的重複字符數。舉個例子,若要找出 2~5 個 o 的連續字符串,如何做? 此時便要用到{}了。由於 { 與 } 在 shell 中有特殊意義,需要用到轉義字符\。
查找連續的兩個 o 字符:

$ grep -n 'o\{2\}' regular_express.txt

查找 g 後面接 2 到 5 個 o,然後再接 g 的字符串

$ grep -n 'go\{2,5\}g' regular_express.txt

總結:

  • ^word 表示帶搜尋的字符串(word)在行首
  • word$ 表示帶搜尋的字符串(word)在行尾
  • .(小數點) 表示 1 個任意字符
  • \ 表示轉義字符,在特殊字符前加\會將特殊字符意義去除
  • * 表示重複 0 到無窮多個前一個 RE(正則表達式)字符
  • [list] 表示搜索含有 list 的字符串
  • [n1-n2] 表示搜索指定的字符串範圍,例如[0-9] [a-z] [A-Z]等
  • [^list] 表示反向字符串的範圍,例如[0-9]表示非數字字符,[A-Z]表示非* 大寫字符範圍
  • \{n,m\} 表示找出 n 到 m 個前一個 RE 字符
  • \{n,\} 表示 n 個以上的前一個 RE 字符

正則表達式運用之 sed 工具命令

sed 是非交互式的編輯器。它不會修改文件,除非使用 shell 重定向來保存結果。默認情況下,所有的輸出行都被打印到屏幕上。
sed 編輯器逐行處理文件(或輸入),並將結果發送到屏幕。具體過程如下:首先 sed 把當前正在處理的行保存在一個臨時緩存區中(也稱爲模式空間),然後處理臨時緩衝區中的行,完成後把該行發送到屏幕上。sed 每處理完一行就將其從臨時緩衝區刪除,然後將下一行讀入,進行處理和顯示。處理完輸入文件的最後一行後,sed 便結束運行。sed 把每一行都存在臨時緩衝區中,對這個副本進行編輯,所以不會修改原文件。
如果要修改原文件,可使用-i 選項。

將 regular_express.txt 的內容列出並打印行號,同時,將 2-5 行刪除顯示

 $ nl regular_express.txt | sed '2,5d'

同上刪除第 2 行

$ nl regular_express.txt | sed '2d'

同上刪除第三行到最後一行, $定位到最後一行

$ nl regular_express.txt | sed '3,$d'

在原文件中刪除第 1 行:

$ sed -i '1d' regular_express.txt

在第二行後添加 test 字符串

a表示在行後加上字符串,i表示在行前添加字符串

$ nl regular_express.txt | sed '2a test'

在第二行前添加 test 字符串

$ nl regular_express.txt | sed '2i test'

在第二行後加入兩行 test,“\n”表示換行符

$ nl regular_express.txt | sed '2a    test\ntest'

將 2-5 行內容取代爲 No 2-5 number

c 爲替換內容選項。

$ nl regular_express.txt | sed '2,5c No 2-5 number'

替換字符串:

sed 's/被替換字符串/新字符串/g'
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章