next up previous contents
Next: 延伸正規表示法 Up: 正規表示法 Previous: 前言   Contents

基礎正規表示法

  • 重要特殊字元(characters)
    RE字符         意義與範例
    ^word    待搜尋的字串(word)在行首。
             #範例:grep -n '^#' re.txt
             搜尋行首為 # 開始的那一行。
    word$    待搜尋的字串(word)在行尾。
             #範例:grep -n '!$' re.txt
             將行尾為 ! 的那一行列印出來。
      .      代表『任意一個』字符,一定是一個任意字符。
             #範例:grep -n 'e.e' re.txt
             搜尋的字串可以是 (eve) (eae) (eee) (e e), 但不能僅有 (ee)。
             亦即 e 與 e 中間『一定』僅有一個字元,而空白字元也是字元。
      \      跳脫字符,將特殊符號的特殊意義去除。
             #範例:grep -n \' re.txt
             搜尋含有單引號 ' 的那一行。
      *      重複零個或多個的前一個 RE 字符
             #範例:grep -n 'ess*' re.txt
             找出含有 (es) (ess) (esss) 等等的字串。
    \{n,m\}  連續 n 到 m 個的『前一個 RE 字符』
             若為 \{n\} 則是連續 n 個的前一個 RE 字符,
             若是 \{n,\} 則是連續 n 個以上的前一個 RE 字符。
             #範例:grep -n 'go\{2,3\}g' re.txt
             在 g 與 g 之間有 2 個到 3 個的 o 存在的字串,亦即 (goog)(gooog)
      [ ]    在 [ ] 當中『謹代表一個待搜尋的字元』
             #範例:grep -n 'g[ld]' re.txt
             搜尋含有 (gl) 或 (gd) 的那一行
             #範例:grep -n '[0-9]' re.txt
             搜尋含有任意數字的那一行。
             在字元集合 [ ] 中的減號 - 是代表兩個字元之間的所有連續字元。
             [^]:^ 在 [ ] 內時, 代表的意義是『反向選擇』
             #範例:grep -n 'oo[^t]' re.txt
             搜尋的字串可以是 (oog) (ood) 但不能是 (oot)。
    
  • 以 grep 擷取字串
    1. 編輯 re.txt 純文字檔
      [dywang@dywIssd zzz]$ vi re.txt
       "Open Source" is a good mechanism to develop programs.
       apple is my favorite food.
       Football game is not use feet only.
       this dress doesn't fit me.
       However, this dress is about $ 3183 dollars. 
       GNU is free air not free beer. 
       Her hair is very beauty. 
       I can’t finish the test. 
       Oh! The soup taste good. 
       motorcycle is cheap than car.
       This window is clear.
       the symbol '*' is represented as start.
       Oh! My god!
       The gd software is a library for drafting programs. 
       You are the best is mean you are the no. 1.
       The world  is the same with "glad".
       I like dog.
       google is the best tools for search keyword.
       goooooogle yes!
       go! go! Let's go.
       # I am csie
      
    2. 搜尋特定字串:從檔案 re.txt 中取得特定字串 the
      [dywang@dywIssd zzz]$ grep -n 'the' re.txt
      8:I can't finish the test.
      12:the symbol '*' is represented as start.
      15:You are the best is mean you are the no. 1.
      16:The world  is the same with "glad".
      18:google is the best tools for search keyword.
      
    3. 該行沒有字串 the 時,才顯示在螢幕上:
      [dywang@dywIssd zzz]$ grep -vn 'the' re.txt
      # 螢幕上出現的行列為除了 8,12,15,16,18 五行之外的其他行列。
      
    4. 取得不論大小寫的字串 the:
      [dywang@dywIssd zzz]$ grep -in 'the' re.txt
      8:I can't finish the test.
      9:Oh! The soup taste good.
      12:the symbol '*' is represented as start.
      14:The gd software is a library for drafting programs.
      15:You are the best is mean you are the no. 1.
      16:The world  is the same with "glad".
      18:google is the best tools for search keyword.
      
    5. 利用 [ ] 來搜尋集合字元
      [dywang@dywIssd zzz]$ grep -n 't[ae]st' re.txt
      8:I can't finish the test.
      9:Oh! The soup taste good.
      # [ ] 裡面不論有幾個字元,都謹代表某『一個』字元。
      
    6. 搜尋有 oo 的字元:
      [dywang@dywIssd zzz]$ grep -n 'oo' re.txt
      1:"Open Source" is a good mechanism to develop programs.
      2:apple is my favorite food.
      3:Football game is not use feet only.
      9:Oh! The soup taste good.
      18:google is the best tools for search keyword.
      19:goooooogle yes!
      
    7. 不想要 oo 前面有 g ,可以利用在集合字元的反向選擇 [^]
      [dywang@dywIssd zzz]$ grep -n '[^g]oo' re.txt
      2:apple is my favorite food.
      3:Football game is not use feet only.
      18:google is the best tools for search keyword.
      19:goooooogle yes!
      
    8. oo 前面不想要有小寫字元:
      [dywang@dywIssd zzz]$ grep -n '[^a-z]oo' re.txt
      3:Football game is not use feet only.
      
    9. 要求字串是數字與英文:[a-zA-Z0-9]
      [dywang@dywIssd zzz]$ grep -n '[0-9]' re.txt
      5:However, this dress is about $ 3183 dollars.
      15:You are the best is mean you are the no. 1.
      
    10. 行首與行尾字元 ^ $
      [dywang@dywIssd zzz]$ grep -n '^the' re.txt
      12:the symbol '*' is represented as start.
      
      [dywang@dywIssd zzz]$ grep -n '^[a-z]' re.txt
      2:apple is my favorite food.
      4:this dress doesn't fit me.
      10:motorcycle is cheap than car.
      12:the symbol '*' is represented as start.
      18:google is the best tools for search keyword.
      19:goooooogle yes!
      20:go! go! Let's go.
      
    11. 不要開頭是英文字母:
      [dywang@dywIssd zzz]$ grep -n '^[^a-zA-Z]' re.txt
      1:"Open Source" is a good mechanism to develop programs.
      21:# I am csie
      
    12. 行尾結束為小數點 (.) 的那一行:正規表示法中小數點代表「任意一個字元」,要找 (.),必須要使用跳脫字元 (\) 來加以解除其特殊意義。
      [dywang@dywIssd zzz]$ grep -n '\.$' re.txt
      1:"Open Source" is a good mechanism to develop programs.
      2:apple is my favorite food.
      3:Football game is not use feet only.
      4:this dress doesn't fit me.
      10:motorcycle is cheap than car.
      11:This window is clear.
      12:the symbol '*' is represented as start.
      15:You are the best is mean you are the no. 1.
      16:The world  is the same with "glad".
      17:I like dog.
      18:google is the best tools for search keyword.
      20:go! go! Let's go.
      
    13. 第 5 9 行及 14 行最後面也是 .,為什麼沒找出來?
      [dywang@dywIssd zzz]$ grep -n '\. $' re.txt
      5:However, this dress is about $ 3183 dollars. 
      6:GNU is free air not free beer. 
      7:Her hair is very beauty. 
      8:I can’t finish the test. 
      9:Oh! The soup taste good. 
      14:The gd software is a library for drafting programs.
      
    14. Windows 的 notepad 會主動加上 ^M 作為斷行的判斷。使用指令 unix2dos 將 re.txt 轉成 DOS 格式,再以 cat -A 顯示檔案內容就可查看到 ^M
      [dywang@dywIssd zzz]$ unix2dos re.txt
      unix2dos: converting file re.txt to DOS format ...
      [dywang@dywIssd zzz]$ cat -A re.txt
      "Open Source" is a good mechanism to develop programs.^M$
      apple is my favorite food.^M$
      Football game is not use feet only.^M$
      this dress doesn't fit me.^M$
      However, this dress is about $ 3183 dollars. ^M$
      GNU is free air not free beer. ^M$
      Her hair is very beauty. ^M$
      I canM-bM-^@M-^Yt finish the test. ^M$
      Oh! The soup taste good. ^M$
      motorcycle is cheap than car.^M$
      This window is clear.^M$
      the symbol '*' is represented as start.^M$
      Oh! My god!^M$
      The gd software is a library for drafting programs. ^M$
      You are the best is mean you are the no. 1.^M$
      The world  is the same with "glad".^M$
      I like dog.^M$
      google is the best tools for search keyword.^M$
      goooooogle yes!^M$
      go! go! Let's go.^M$
      # I am csie^M$
      
    15. 再將 re.txt 轉回 UNIX 格式,找出哪一行是『空白行』?re.txt 沒有空白行。
      [dywang@dywIssd zzz]$ dos2unix re.txt
      dos2unix: converting file re.txt to UNIX format ...
      
      [dywang@dywIssd zzz]$ grep -n '^$' re.txt
      
    16. 使用 vim 在 re.txt 最後加一行空白行,再找出 22 行是『空白行』?
      [dywang@dywIssd zzz]$ vim re.txt
      [dywang@dywIssd zzz]$ grep -n '^$' re.txt
      22:
      
    17. 『.』代表『絕對有一個任意字元』
      [dywang@dywIssd zzz]$ grep -n 'g..d' re.txt
      1:"Open Source" is a good mechanism to develop programs.
      9:Oh! The soup taste good.
      16:The world  is the same with "glad".
      
    18. 『*』代表的是『重複 0 個或多個前面的 RE 字符』
      [dywang@dywIssd zzz]$ grep -n 'ooo*' re.txt
      1:"Open Source" is a good mechanism to develop programs.
      2:apple is my favorite food.
      3:Football game is not use feet only.
      9:Oh! The soup taste good.
      18:google is the best tools for search keyword.
      19:goooooogle yes!
      
    19. 字串開頭與結尾都是 g,但是兩個 g 之間僅能存在至少一個 o
      # 亦即 gog, goog, gooog.... 等。 
      [dywang@dywIssd zzz]$ grep -n 'goo*g' re.txt
      18:google is the best tools for search keyword.
      19:goooooogle yes!
      
    20. 找出 g 開頭與 g 結尾的字串,當中的字元可有可無。(錯誤找法)
      [dywang@dywIssd zzz]$ grep -n 'g*g' re.txt
      1:"Open Source" is a good mechanism to develop programs.
      3:Football game is not use feet only.
      9:Oh! The soup taste good.
      13:Oh!  My god!
      14:The gd software is a library for drafting programs.
      16:The world  is the same with "glad".
      17:I like dog.
      18:google is the best tools for search keyword.
      19:goooooogle yes!
      # g*g 的內容是 g, gg, ggg, gggg。
      
    21. 找出 g 開頭與 g 結尾的字串,當中的字元可有可無。
      [dywang@dywIssd zzz]$ grep -n 'g.*g' re.txt
      1:"Open Source" is a good mechanism to develop programs.
      14:The gd software is a library for drafting programs.
      18:google is the best tools for search keyword.
      19:goooooogle yes!
      
    22. 要找出『任意數字』的行列:
      [dywang@dywIssd zzz]$ grep -n '[0-9][0-9]*' re.txt
      5:However, this dress is about $ 3183 dollars.
      15:You are the best is mean you are the no. 1.
      # 使用 grep -n '[0-9]' re.txt 也可以得到相同的結果。
      
    23. 限定連續 RE 字符範圍 {}:找到兩個 o 的字串。
      [dywang@dywIssd zzz]$ grep -n 'o\{2\}' re.txt
      1:"Open Source" is a good mechanism to develop programs.
      2:apple is my favorite food.
      3:Football game is not use feet only.
      9:Oh! The soup taste good.
      18:google is the best tools for search keyword.
      19:goooooogle yes!
      
    24. 找出 g 後面接 2 到 5 個 o ,然後再接一個 g 的字串:
      [dywang@dywIssd zzz]$ grep -n 'go\{2,5\}g' re.txt
      18:google is the best tools for search keyword.
      
    25. 找出 2 個 o 以上的 goooo....g?除了可以是 gooo*g ,也可以是:
      [dywang@dywIssd zzz]$ grep -n 'go\{2,\}g' re.txt
      18:google is the best tools for search keyword.
      19:goooooogle yes!
      
    26. 找出 2 個 o 以上的 goooo....g,當找到一筆即停止。
      [dywang@dywIssd zzz]$ grep -m 1 'go\{2,\}g' re.txt
      18:google is the best tools for search keyword.
      19:goooooogle yes!
      

  • 『正規表示法的特殊字元』與『萬用字元』之差異:
    字元或代表意義 萬用字元 正規表示法的特殊字元
    * 0 至無限多個字元 重複 0 到多個的前一個 RE 字符
    反向選擇 [!range] [^range]
    例題:不支援正規表示法的 ls 工具中
    『ls -l * 』:代表列出任意檔名的檔案;
    『ls -l a* 』:代表列出以 a 為開頭的任何檔名的檔案。
    在正規表示法中要找到含有以 a 為開頭的檔案,必須搭配支援正規表示法的工具 grep:
    ls | grep -n '^a.*'
    
  • 例題:以正規表示法顯示行號方式找出目錄 /etc 以下符合下列條件之檔案。
    1. 包含 boot 或 root 字串的檔案。
    2. 包含 b 開頭 t 結尾之字串的檔案。
    3. b 開頭 t 結尾且中間 1 個 o 以上之字串的檔案。
    4. 包含 b 開頭 t 結尾且中間 2 至 4 個 o 之字串的檔案。
    5. 包含行首為 root 之字串的檔案。
    6. 包含行尾為 root 之字串的檔案。
  • 例題:想要查出來檔案中含有 ! 與 > 的字行( ! 在正規表示法中並不是特殊字元):
    grep -n '[!>]' re.txt
    

練習題

  1. 如何以 grep 配合正規表示法,搜尋檔案 re.txt 中,行首為 # 的行,並列出行號?
    Sol. grep -n '^#' re.txt
  2. 如何以 grep 配合正規表示法,搜尋檔案 re.txt 中,行尾為 ! 的行,並列出行號?
    Sol. grep -n '!$' re.txt
  3. 如何以 grep 配合正規表示法,搜尋檔案 re.txt 中, e 與 e 中間『一定』僅有一個字元(含空白字元)的行,並列出行號?
    Sol. grep -n 'e.e' re.txt
  4. 如何以 grep 配合正規表示法,搜尋檔案 re.txt 中,含有單引號 ' 的行,並列出行號?
    Sol. grep -n \' re.txt
  5. 如何以 grep 配合正規表示法,搜尋檔案 re.txt 中,含有 es, ess, esss,... 等字串的行,並列出行號?
    Sol. grep -n 'ess*' re.txt
  6. 如何以 grep 配合正規表示法,搜尋檔案 re.txt 中,在 g 與 g 之間有 2 個到 3 個 o 字串的行,並列出行號?
    Sol. grep -n 'go\{2,3\}g' re.txt
  7. 如何以 grep 配合正規表示法,搜尋檔案 re.txt 中,含有 gl 或 gd 的行,並列出行號?
    Sol. grep -n 'g[ld]' re.txt
  8. 如何以 grep 配合正規表示法,搜尋檔案 re.txt 中,含有任意數字的行,並列出行號?
    Sol. grep -n '[0-9]' re.txt
  9. 如何以 grep 配合正規表示法,搜尋檔案 re.txt 中,含有 oo 字串,但不能是 oot 的行,並列出行號?
    Sol. grep -n 'oo[^t]' re.txt
  10. 如何以 grep 配合正規表示法,搜尋檔案 re.txt 中,含有 the 字串的行,並列出行號?
    Sol. grep -n 'the' re.txt
  11. 如何以 grep 配合正規表示法,搜尋檔案 re.txt 中,沒含有 the 字串的行,並列出行號?
    Sol. grep -vn 'the' re.txt
  12. 如何以 grep 配合正規表示法,搜尋檔案 re.txt 中,含有不論大小寫 the 字串的行,並列出行號?
    Sol. grep -in 'the' re.txt
  13. 如何以 grep 配合正規表示法,搜尋檔案 re.txt 中,含有 tast 或 test 字串的行,並列出行號?
    Sol. grep -n 't[ae]st' re.txt
  14. 如何以 grep 配合正規表示法,搜尋檔案 re.txt 中,含有 oo 字串,但其前面不是 g 的行,並列出行號?
    Sol. grep -n '[^g]oo' re.txt
  15. 如何以 grep 配合正規表示法,搜尋檔案 re.txt 中,含有 oo 字串,但其前面不是小寫字元的行,並列出行號?
    Sol. grep -n '[^a-z]oo' re.txt
  16. 如何以 grep 配合正規表示法,搜尋檔案 re.txt 中,含有數字或英文字串,但其前面不是小寫字元的行,並列出行號?
    Sol. grep -n '[^a-z][a-zA-Z0-9]' re.txt
  17. 如何以 grep 配合正規表示法,搜尋檔案 re.txt 中,行首為 the 的行,並列出行號?
    Sol. grep -n '^the' re.txt
  18. 如何以 grep 配合正規表示法,搜尋檔案 re.txt 中,行首開頭為英文字母的行,並列出行號?
    Sol. grep -n '^[a-zA-Z]' re.txt
  19. 如何以 grep 配合正規表示法,搜尋檔案 re.txt 中,行首開頭不要是英文字母的行,並列出行號?
    Sol. grep -n '^[^a-zA-Z]' re.txt
  20. 如何以 grep 配合正規表示法,搜尋檔案 re.txt 中,行尾結束為小數點 . 的行,並列出行號?
    Sol. grep -n '\.$' re.txt
  21. 如何以 grep 配合正規表示法,搜尋檔案 re.txt 中空白行,並列出行號?
    Sol. grep -n '^$' re.txt
  22. 如何以 grep 配合正規表示法,搜尋檔案 re.txt 中,含有以 g 開頭 d 結尾,且中間剛好兩個字元之字串的行,並列出行號?
    Sol. grep -n 'g..d' re.txt
  23. 如何以 grep 配合正規表示法,搜尋檔案 re.txt 中,含有以 g 開頭 d 結尾之字串,但 g 與 d 之間僅能存在至少一個 o 的行,並列出行號?
    Sol. grep -n 'goo*d' re.txt
  24. 如何以 grep 配合正規表示法,搜尋檔案 re.txt 中,含有『任意數字』的行,並列出行號?
    Sol. grep -n '[0-9][0-9]*' re.txt
  25. 如何以 grep 配合正規表示法,搜尋檔案 re.txt 中,含有 2 個 o 字串的行,並列出行號?
    Sol. grep -n 'o\{2\}' re.txt
  26. 如何以 grep 配合正規表示法,搜尋檔案 re.txt 中,含有 g 後面接 2 到 5 個 o,然後再接一個 g 之字串的行,並列出行號?
    Sol. grep -n 'go\{2,5\}g' re.txt
  27. 如何以 grep 配合正規表示法,搜尋檔案 re.txt 中,含有 g 後面接 2 個以上 o,然後再接一個 g 之字串的行,並列出行號?
    Sol. grep -n 'go\{2,\}g' re.txt
  28. 如何以 grep 配合正規表示法,搜尋檔案 re.txt 中,含有 g 後面接 2 個以上 o,然後再接一個 g 之字串的行,且找到第二筆即停止搜尋?
    Sol. grep -m 2 'go\{2,\}g' re.txt
  29. * 在『萬用字元』與『正規表示法』中有何差異?
    Sol. 在萬用字元中為 0 至無限多個字元,而在正規表示法中為重複 0 到多個的前一個 RE 字符
  30. 在『萬用字元』與『正規表示法』中反向選擇之用法有何差異?
    Sol. 在萬用字元中為 [!range],而在正規表示法中為 [^range]
  31. 如何以 grep 配合正規表示法,搜尋目錄 /etc 中,含有 boot 或 root 字串的檔案,並列出行號?
    Sol. grep -n '[br]oot' /etc/*
  32. 如何以 grep 配合正規表示法,搜尋目錄 /etc 中,含有 b 開頭 t 結尾之字串的檔案,並列出行號?
    Sol. grep -n 'b.*t' /etc/*
  33. 如何以 grep 配合正規表示法,搜尋目錄 /etc 中,含有 b 開頭 t 結尾且中間 1 個 o 以上之字串的檔案,並列出行號?
    Sol. grep -n 'bo\{1,\}t' /etc/*grep -n 'boo*t' /etc/*
  34. 如何以 grep 配合正規表示法,搜尋目錄 /etc 中,含有 b 開頭 t 結尾且中間 2 至 4 個 o 之字串的檔案,並列出行號?
    Sol. grep -n 'bo\{2,4\}t' /etc/*
  35. 如何以 grep 配合正規表示法,搜尋目錄 /etc 中,含有行首為 root 之字串的檔案,並列出行號?
    Sol. grep -n '^boot' /etc/*
  36. 如何以 grep 配合正規表示法,搜尋目錄 /etc 中,含有行尾為 root 之字串的檔案,並列出行號?
    Sol. grep -n 'boot$' /etc/*
  37. 如何以 grep 配合正規表示法,搜尋目錄 /etc 中,含有 ! 與 > 的字元的檔案,並列出行號?
    Sol. grep -n '[!>]' /etc/*


next up previous contents
Next: 延伸正規表示法 Up: 正規表示法 Previous: 前言   Contents
2017-06-14