終於明白vim 和 grep 中 的正則表達式的用法, vim 正則表達式 和grep基本正則表達式 幾乎一樣


要搞清楚 vim中的正則和普通的Perl正則表達式的區別:
因為在perl中所有的元字符 都可以直接使用, 不需要在 元字符的前面加 反斜杠.

但是在vim, 包括grep中就有所區別, 同樣是元字符, 有的就要在前面加上 反斜杠才行. 由於 vim和grep各自的關於正則的用法不盡相同, 所以 只能是 一個一個的記清楚,別的沒有什么好辦法了. 主要是記住不同的地方.

第一, 只說在vim中的正則: 參考: https://www.tuicool.com/articles/QzUBZr

  1. 首先 vim中的元字符 有 四種情形, 分別表示的是 四種作用:
  • 用來表示 單個 的 字符 的 元字符; (即 "字符"元字符, 注意的是, 每個字符元字符 表示的, 代表的總是 一個 字符 因為 你是一個元字符嘛, 所以你也只能代表一個字符, 要表示數量, 有專門的 "數量"元字符)
  • 用來表示 數量的 元字符; 即 "數量"元字符
  • 用來表示 位置的 元字符 , 即 "位置" 元字符
  • 用來表示 分組的 元字符 即 "分組" 元字符. (括號元字符)
  1. 在這些元字符中
  • 字符元字符包括: ., [abc] ,[^abc] , 以及專門符號表示的, 如:\d, \D, \w, \W, \x. \X, \s, \S (注意 如果要表示空格字符的話, 使用 \s)
    或者要表示空格, 使用 \空格,這里, 空格必須轉義 因為默認的, 空格表示 命令單詞的 分割.
    如果要 表示 "字符元字符"本身的話, 要用\ 轉義, 比如: \. \[ \* \\

  • 數量元字符中, 只有* 不用反斜杠, 其他的都要用 反斜杠, 包括: \+, \? \{m, n}, 注意, 大括號表示次數, 模糊匹配次數, 只需要在第一個大括號前加反斜杠, 當然在第二個大括號前加反斜杠也是可以的. 比如: /k\{2, 4}/ = /k\{2, 4\}

  • 位置元字符, 只有四個: ^, $, \<表示單詞的開頭 , \> 表示單詞的結尾. 很清楚的: ^ 說的是 行首, 是匹配 **一行**的 開始 , 關心的是行! 而 \<才是句中的 單詞 的詞首. 一個是行首, 一個是詞首. ...
    如果只是要匹配 1個 單詞, 則使用 \w* 因為當一個單詞結束時, 必然會遇到空格或 其他標點符號.
    其中\<和 \> 是可以單獨使用的, 單詞的開頭 是以 "空格" 和 標點符號為 標識的 . 所以: /r/ 和 /\<r/ 是不同的, 特別要注意, 既然是單詞 的開頭或結尾, 那么 這個單詞就必須是以 \w, 或 [0-9a-zA-Z] 開頭的才行, 如果不是以這些開頭的, 就不能算是開頭!

  • 括號元字符, vim中的括號元字符 要用 反斜杠表示 : \( \) 而 前向 引用仍然用 \1, \2 等表示.

大多數的元字符在 替換字符串中, 都將失去意義, 表示普通字符, 只有極少數的幾個元字符 仍有意義 比如&...

使用vim的正則表達式主要有 三種情況: 一是 搜索, 二是刪除 : 使用 /d命令, 三是 替換

**在使用刪除命令 的時候, 略有不同, 默認的是 只刪除當前(向下查找)找到的第一個 對象. 如果要表示 整個文件 的 所有的范圍的 , 要用 g(=global) 不能用 %(替換用的是%), 而且要放在 最前面, 即 ** : g/^$/d


第二, grep中的正則. 跟 vim中的正則, 除了 "擴展正則" 中的元字符不同外, 其他幾乎完全一樣, 比如 在數詞 元字符的表示上, 大括號都要用 \{m, n \} (這里的 n后面的大括號一定要加\)

  1. 通常支持的是 "基本正則表達式", 如果要使用 "擴展正則表達式" , 可以有兩種方法, 一是, 使用 -E選項, 二是 使用 專門的一個命令: egrep.
  2. 記住, 擴展的正則表達式, 只比 "基本正則"多4個 元字符: +, ? |, 括號 ()
    比如: 要過濾 bootps或 bootpc
    使用 cat /etc/services | grep -n 'bootps|bootpc' 會返回空, 而用 cat /etc/services | grep -nE 'bootps|bootpc' 則返回bootps和bootpc的行, 這是因為 | 只在 "擴展正則"中被支持

grep的用法上, 除了 要正確使用 單引號 括起來的正則表達式之外, 還要 熟悉它的 幾個 常用的選項, 比如: -n, -E , -v(反選) -A, -B 等等.




### 最后記住的是, 正則表達式和 shell的 通配符不一樣! shell的通配符通常只有` *, ? [... ] 三個.`

linux中的幾乎所有的命令, 都會有 控制台的屏幕 輸出 , 像 head, tail, grep等等 , 所以 凡是這些 控制台屏幕的 輸出內容 , 幾乎都可以將 它們 重定向到 文件中.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM