要搞清楚 vim中的正則和普通的Perl正則表達式的區別:
因為在perl中所有的元字符 都可以直接使用, 不需要在 元字符的前面加 反斜杠.
但是在vim, 包括grep中就有所區別, 同樣是元字符, 有的就要在前面加上 反斜杠才行. 由於 vim和grep各自的關於正則的用法不盡相同, 所以 只能是 一個一個的記清楚,別的沒有什么好辦法了. 主要是記住不同的地方.
第一, 只說在vim中的正則: 參考: https://www.tuicool.com/articles/QzUBZr
- 首先 vim中的元字符 有 四種情形, 分別表示的是 四種作用:
- 用來表示 單個 的 字符 的 元字符; (即 "字符"元字符, 注意的是, 每個字符元字符 表示的, 代表的總是 一個 字符 因為 你是一個元字符嘛, 所以你也只能代表一個字符, 要表示數量, 有專門的 "數量"元字符)
- 用來表示 數量的 元字符; 即 "數量"元字符
- 用來表示 位置的 元字符 , 即 "位置" 元字符
- 用來表示 分組的 元字符 即 "分組" 元字符. (括號元字符)
- 在這些元字符中
-
字符元字符包括: ., [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后面的大括號一定要加\)
- 通常支持的是 "基本正則表達式", 如果要使用 "擴展正則表達式" , 可以有兩種方法, 一是, 使用 -E選項, 二是 使用 專門的一個命令: egrep.
- 記住, 擴展的正則表達式, 只比 "基本正則"多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的通配符通常只有` *, ? [... ] 三個.`