Linux 正則表示式 vi, grep, sed, awk
1. vi
表示內容的元字元
模式 |
含義 |
. |
匹配任意字元 |
[abc] |
匹配方括號中的任意一個字元。可以使用-表示字元範圍,如[a-z0-9]匹配小寫字母和阿拉伯數字。 |
[^abc] |
在方括號內開頭使用^符號,表示匹配除方括號中字元之外的任意字元。 |
\d |
匹配阿拉伯數字,等同於[0-9]。 |
\D |
匹配阿拉伯數字之外的任意字元,等同於[^0-9]。 |
\x |
匹配十六進位制數字,等同於[0-9A-Fa-f]。 |
\X |
匹配十六進位制數字之外的任意字元,等同於[^0-9A-Fa-f]。 |
\w |
匹配單詞字母,等同於[0-9A-Za-z_]。 |
\W |
匹配單詞字母之外的任意字元,等同於[^0-9A-Za-z_]。 |
\t |
匹配<TAB>字元。 |
\s |
匹配空白字元,等同於[ \t]。 |
\S |
匹配非空白字元,等同於[^ \t]。 |
\a |
所有的字母字元. 等同於[a-zA-Z] |
\l |
小寫字母 [a-z] |
\L |
非小寫字母 [^a-z] |
\u |
大寫字母 [A-Z] |
\U |
非大寫字母 [^A-Z] |
模式 |
含義 |
* |
匹配0-任意個 |
\+ |
匹配1-任意個 |
\? |
匹配0-1個 |
\{n,m} |
匹配n-m個 |
\{n} |
匹配n個 |
\{n,} |
匹配n-任意個 |
\{,m} |
匹配0-m個 |
\_. |
匹配包含換行在內的所有字元 |
\{-} |
表示前一個字元可出現零次或多次,但在整個正則表示式可以匹配成功的前提下,匹配的字元數越少越好 |
\= |
匹配一個可有可無的項 |
\_s |
匹配空格或斷行 |
表示轉義和位置的元字元
模式 | 含義 | 模式 | 含義 |
\* | 匹配 * 字元 | $ | 匹配行尾 |
\. | 匹配 . 字元 | ^ | 匹配行首 |
\/ | 匹配 / 字元 | \< | 匹配單詞詞首 |
\\ | 匹配 \ 字元 | \> | 匹配單詞詞尾 |
\[ | 匹配 [ 字元 |
替換變數
在正規表示式中使用 \( 和 \) 符號括起正規表示式,即可在後面使用\1、\2等變數來訪問 \( 和 \) 中的內容。
懶惰模式
\{-n,m} 與\{n,m}一樣,儘可能少次數地重複
\{-} 匹配它前面的項一次或0次, 儘可能地少
2. grep (global regular expression and print the line)
^
錨定行的開始 如:'^grep'匹配所有以grep開頭的行。
$
錨定行的結束 如:'grep$'匹配所有以grep結尾的行。
.
匹配一個非換行符的字元 如:'gr.p'匹配gr後接一個任意字元,然後是p。
*
匹配零個或多個先前字元 如:'*grep'匹配所有一個或多個空格後緊跟grep的行。 .*一起用代表任意字元。
[]
匹配一個指定範圍內的字元,如'[Gg]rep'匹配Grep和grep。
[^]
匹配一個不在指定範圍內的字元,如:'[^A-FH-Z]rep'匹配不包含A-F和H-Z的一個字母開頭,緊跟rep的行。
\(..\)
標記匹配字元,如'\(love\)',love被標記為1。
\<
錨定單詞的開始,如:'\<grep'匹配包含以grep開頭的單詞的行。
\>
錨定單詞的結束,如'grep\>'匹配包含以grep結尾的單詞的行。
x\{m\}
重複字元x,m次,如:'o\{5\}'匹配包含5個o的行。
x\{m,\}
重複字元x,至少m次,如:'o\{5,\}'匹配至少有5個o的行。
x\{m,n\}
重複字元x,至少m次,不多於n次,如:'o\{5,10\}'匹配5--10個o的行。
\w
匹配文字和數字字元,也就是[A-Za-z0-9],如:'G\w*p'匹配以G後跟零個或多個文字或數字字元,然後是p。
\W
\w的反置形式,匹配一個或多個非單詞字元,如點號句號等。
\b
單詞鎖定符,如: '\bgrep\b'只匹配grep。
egrep 支援 +, ?, | 等
3. sed - stream editor for filtering and transforming text
sed每次處理一行內容。處理時先把當前要處理的行儲存在臨時緩衝區,(稱為“模式空間”,pattern space),用sed命令處理完成後(命令hHgGx用於處理hold space,跟模式空間一起完成處理),把緩衝區的內容送往output(即螢幕)。然後處理下一行,依次重複到檔案末尾。sed不改變檔案的內容變,但可以將結果重定向。
sed定址:
可以直接通過指定行數或者模式或者二者的組合選定要進行編輯的行, 如果不指定則處理所有的行。
sed '2,5d' file # 刪除第2~5行
sed-n'3p' file # 只打印第三行 -n表示不列印匹配的行
sed'/My/,/You/d' file # 刪除my~You之間的行
命令 | 功能 |
a\ |
在當前行後新增一行或多行。多行時除最後一行外,每行末尾需用“\”續行 |
c\ | 用此符號後的新文字替換當前行中的文字。多行時除最後一行外,每行末尾需用"\"續行 |
i\ | 在當前行之前插入文字。多行時除最後一行外,每行末尾需用"\"續行 |
d | 刪除行 |
h | 把模式空間裡的內容複製到暫存緩衝區 |
H | 把模式空間裡的內容追加到暫存緩衝區 |
g | 把暫存緩衝區裡的內容複製到模式空間,覆蓋原有的內容 |
G | 把暫存緩衝區的內容追加到模式空間裡,追加在原有內容的後面 |
l | 列出非列印字元 |
p | 列印行(模式空間) |
n | 讀入下一輸入行,並從下一條命令而不是第一條命令開始對其的處理 |
r | 從檔案中讀取輸入行 |
! | 對所選行以外的所有行應用命令 |
s | 用一個字串替換另一個 |
g | 在行內進行全域性替換 |
w | 將所選的行寫入檔案 |
x | 交換暫存緩衝區與模式空間的內容 |
y | 將字元替換為另一字元(不能對正則表示式使用y命令) |
元字元 | 功能 | 示例 |
^ | 行首定位符 | /^my/ 匹配所有以my開頭的行 |
$ | 行尾定位符 | /my$/ 匹配所有以my結尾的行 |
. | 匹配除換行符以外的單個字元 | /m..y/ 匹配包含字母m,後跟兩個任意字元,再跟字母y的行 |
* | 匹配零個或多個前導字元 | /my*/ 匹配包含字母m,後跟零個或多個y字母的行 |
[] | 匹配指定字元組內的任一字元 | /[Mm]y/ 匹配包含My或my的行 |
[^] | 匹配不在指定字元組內的任一字元 | /[^Mm]y/ 匹配包含y,但y之前的那個字元不是M或m的行 |
\(..\) | 儲存已匹配的字元 | 1,20s/\(you\)self/\1r/ 標記元字元之間的模式,並將其儲存為標籤1,之後可以使用\1來引用它。最多可以定義9個標籤,從左邊開始編號,最左邊的是第一個。此例中,對第1到第20行進行處理,you被儲存為標籤1,如果發現youself,則替換為your。 |
& | 儲存查詢串以便在替換串中引用 | s/my/**&**/ 符號&代表查詢串。my將被替換為**my** |
\< | 詞首定位符 | /\<my/ 匹配包含以my開頭的單詞的行 |
\> | 詞尾定位符 | /my\>/ 匹配包含以my結尾的單詞的行 |
x\{m\} | 連續m個x | /9\{5\}/ 匹配包含連續5個9的行 |
x\{m,\} | 至少m個x | /9\{5,\}/ 匹配包含至少連續5個9的行 |
x\{m,n\} | 至少m個,但不超過n個x | /9\{5,7\}/ 匹配包含連續5到7個9的行 |
sed 不管是否找到指定的模式,退出狀態都是0。只有當命令存在語法錯誤時,sed的退出狀態才不是0。
4. awk - pattern scanning and processing language
awk 命令逐行掃描檔案,尋找匹配特定模式的行,並在這些行上進行操作。命令語法:
awk -F域分隔符 'command' file
或
awk -f script-file file
command 由pattern + {action}組成,兩者均為可選。如果沒有指定模式,則應用到所有行;如果沒有指定動作,則列印到標準輸出 (螢幕)。
模式可以為:
/正則表示式/
關係表示式
模式匹配表示式: ~ 和 ~!
行的範圍
BEGIN
END
action可以為:
變數或陣列賦值
輸出
函式操作
控制流命令