要搞清楚 vim中的正則和普通的Perl正則表達式的區別: 由於在perl中全部的元字符 均可以直接使用, 不須要在 元字符的前面加 反斜槓.linux
可是在vim, 包括grep中就有所區別, 一樣是元字符, 有的就要在前面加上 反斜槓才行. 因爲 vim和grep各自的關於正則的用法不盡相同, 因此 只能是 一個一個的記清楚,別的沒有什麼好辦法了. 主要是記住不一樣的地方.
第一, 只說在vim中的正則: 參考: https://www.tuicool.com/articles/QzUBZr
- 首先 vim中的元字符 有 四種情形, 分別表示的是 四種做用:
- 用來表示 單個 的 字符 的 元字符; (即 "字符"元字符, 注意的是, 每一個字符元字符 表示的, 表明的老是 一個 字符 由於 你是一個元字符嘛, 因此你也只能表明一個字符, 要表示數量, 有專門的 "數量"元字符)
- 用來表示 數量的 元字符; 即 "數量"元字符
- 用來表示 位置的 元字符 , 即 "位置" 元字符
- 用來表示 分組的 元字符 即 "分組" 元字符. (括號元字符)
- 在這些元字符中
-
字符元字符包括: ., [abc] ,[^abc] , 以及專門符號表示的, 如:
\d, \D, \w, \W, \x. \X, \s, \S (注意 若是要表示空格字符的話, 使用 \s)
<font color="red"> 或者要表示空格, 使用\空格,
這裏, 空格必須轉義 由於默認的, 空格表示 命令單詞的 分割. </font> 若是要 表示 "字符元字符"自己的話, 要用\ 轉義, 好比:\. \[ \* \\
正則表達式 -
數量元字符中, 只有* 不用反斜槓, 其餘的都要用 反斜槓, 包括:
\+, \? \{m, n}
, 注意, 大括號表示次數, 模糊匹配次數, 只須要在第一個大括號前加反斜槓, 固然在第二個大括號前加反斜槓也是能夠的. 好比:/k\{2, 4}/ = /k\{2, 4\}
shell -
位置元字符, 只有四個:
^, $, \<表示單詞的開頭 , \> 表示單詞的結尾. 很清楚的: ^ 說的是 行首, 是匹配 **一行**的 開始 , 關心的是行! 而 \<纔是句中的 單詞 的詞首. 一個是行首, 一個是詞首. ...
若是隻是要匹配 1個 單詞, 則使用\w*
由於當一個單詞結束時, 必然會遇到空格或 其餘標點符號. 其中\<和 \> 是能夠單獨使用的,
單詞的開頭 是以 "空格" 和 標點符號爲 標識的 . 因此:/r/ 和 /\<r/ 是不一樣的
, <font color="red"> 特別要注意, 既然是單詞 的開頭或結尾, 那麼 這個單詞就必須是以\w, 或 [0-9a-zA-Z]
開頭的才行, 若是不是以這些開頭的, 就不能算是開頭! </font>vim -
括號元字符, vim中的括號元字符 要用 反斜槓表示 :
\( \)
而 前向 引用仍然用\1, \2
等表示.ui
大多數的元字符在 替換字符串中, 都將失去意義, 表示普通字符, 只有極少數的幾個元字符 仍有意義 好比&...
使用vim的正則表達式主要有 三種狀況: 一是 搜索, 二是刪除 : 使用 /d命令
, 三是 替換
**在使用刪除命令 的時候, 略有不一樣, 默認的是 只刪除當前(向下查找)找到的第一個 對象. 若是要表示 整個文件 的 全部的範圍的 , 要用 g(=global) 不能用 %(替換用的是%), 並且要放在 最前面, 即 ** : g/^$/d
url
第二, 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 等等.
<br>spa
<br> ### 最後記住的是, 正則表達式和 shell的 通配符不同! shell的通配符一般只有` *, ? [... ] 三個.`.net