通俗來說,正則表達式是一種字符串的匹配方式,好比使用星號「*」來匹配任意的字符等。正則表達式其實是一個匹配模板,當bash執行這個正則表達式時,就會將全部的輸入數據與匹配模板匹配,匹配不成功的數據將會被過濾掉。 正則表達式
表1.經常使用的元字符 bash
字符 工具 |
含義 spa |
舉例 翻譯 |
. 3d |
匹配除換行符之外的任意字符 對象 |
\bhi\b.*\bLucy\b ci |
\w 字符串 |
匹配字母或數字或下劃線或漢字 string |
\bhe\w |
\s |
匹配任意的空白符(包括空格製表符換頁符) |
|
\b |
匹配單詞的開始或結束 |
\bhi\b |
^ |
匹配字符串的開始 |
^g.*d$ |
$ |
匹配字符串的結束 |
grep ‘d$’ test.ini |
表2.經常使用的限定符
字符 |
含義 |
舉例 |
* |
重複零次或更屢次 |
grep ‘o*’tet.ini |
+ |
重複一次或更屢次 |
[0-9]+匹配1個或更多的數字 |
? |
重複零次或一次 |
|
{n} |
重複n次 |
^9{2}$ |
{n,} |
重複n次或更屢次 |
|
{n,m} |
重複n到m次 |
|
表3.經常使用的反義代碼
/語法 |
說明 |
\W |
匹配任意不是字母,數字,下劃線,漢字的字符 |
\S |
匹配任意不是空白符的字符 |
\B |
匹配不是單詞開頭或結束的位置 |
[^x] |
匹配除了x之外的任意字符 |
[^aeiou] |
匹配除了aeiou這幾個字母之外的任意字符 |
表4.擴展正則表達式
字符 |
含義 |
舉例 |
{n,m} |
等同於基本正則表達式的\{n,m\} |
egrep –n ‘9{1,3}’ tmp |
+ |
匹配前面一個字符出現一次或屢次 |
egrep –n ‘go+d’ tmp |
? |
匹配前面一個字符出現零次或一次 |
egrep –n ‘go+d’ tmp |
| |
匹配邏輯或者,即匹配|前或後的字符串 |
egrep –n ‘adm|ftp’ tmp egrep –n ‘(n|f)tp’ tmp |
() |
匹配正則集合 |
sed 's/\(root\)\(.*\)\(bash\)/\hei\2\hello/' tmp |
當用sed命令對文本進行處理的時候,sed先讀取對象的文本文件的第一行到模式空間中。
當有內容進入「模式空間」時,sed的編輯命令對模式空間中的內容進行編輯操做(修改,替換,刪除,追加,顯示等等)
模式空間中的內容編輯處理完成以後,sed把此內容經過標準輸出(默認爲顯示器)打印出來,並刪除模式空間中的內容。
第一行處理結束。重新讀取第二行的內容進行處理,直到最後一行。
Sed [參數選項] {腳本指令} [輸入文件]
命令 |
功能描述 |
a\ |
在當前行的後面加入一行或者文本。 |
c\ |
用新的文本改變或者替代本行的文本。 |
d |
從pattern space位置刪除行。 |
i\ |
在當前行的上面插入文本。 |
h |
拷貝pattern space的內容到holding buffer(特殊緩衝區)。 |
H |
追加pattern space的內容到holding buffer。 |
g |
得到holding buffer中的內容,並替代當前pattern space中的文本。(替換最後一行) |
G |
得到holding buffer中的內容,並追加到當前pattern space的後面。(追加到最後一行) |
n |
讀取下一個輸入行,用下一個命令處理新的行而不是用第一個命令。 |
p |
打印pattern space中的行。 //小寫 |
P |
打印pattern space中的第一行。 //大寫 |
q |
退出sed。 |
w file |
寫並追加pattern space到file的末尾。 |
! |
表示後面的命令對全部沒有被選定的行發生做用。sed '/ftp/!a hello' tmp |
s/re/string |
用string替換正則表達式re。 |
= |
打印當前行號碼。 |
替換標記 |
|
g |
行內全面替換,若是沒有g,只替換第一個匹配。 |
p |
打印行。 |
x |
互換pattern space和holding buffer中的文本。 sed -e '/adm/h' -e '/ftp/x' tmp |
y |
把一個字符翻譯爲另外一個字符(可是不能用於正則表達式)。Sed ‘y/a/A/’ tmp |
選項 |
|
-e |
容許多點編輯。 |
-n |
取消默認輸出。 |
-f |
直接將sed的動做寫在一個文件內 |
-i |
直接修改文件內容,而不是輸出到終端 |
-r |
Sed的擴展表達式的用法 |
2.2.1.新增
在某一行後面加入新內容
sed ‘/匹配項/a\新增項’文件名
匹配某一行,在這行前面加入新內容
sed ‘/匹配項/i\新增項’文件名
在某一行的後面加入新內容
sed ‘3a 新增項’文件名
匹配某一行,在這行前面加入新內容
sed ‘3i 新增項’文件名
匹配某一行,在某一行的後面讀入某文件的內容
sed ‘/匹配項/r 新增文件’ 文件名
匹配某一內容,並將該內容寫到其餘文件中
Sed ‘/匹配項/w 其餘文件名’文件名
刪除全部空行並在每一行的後面增長一個空行
sed ‘/^$/d;G’ 文件名
匹配某一行,把這一行加到全部行的後面
sed ‘/匹配項/h;G’文件名
2.2.2.替換
匹配某一內容並將該行第一個該內容替換
sed ‘s/匹配項/替換項/’文件名
匹配某一內容並所有替換該內容
sed ‘s/匹配項/替換項/g’文件名
匹配某一內容,並將該行內的另外一內容替換
sed ‘/匹配項1/s/匹配項2/替換項2/’文件名
匹配某一項,並將含有該內容的整行替換
sed ‘/匹配項/c\替換項’文件名
2.2.3.刪除
刪除第幾行
sed ‘3d’文件名
sed ‘$d’文件名
匹配某一行並刪除
sed ‘/匹配項/d’文件名
刪除第幾行到第幾行
sed ‘2,5d’文件名
刪除文中全部字母
sed ‘s/[a-zA-Z]//g’文件名
刪除文中全部數字
sed ‘s/[0-9]//g’文件名
刪除文中的基數行
sed '1~2d' tmp
注意:若是要直接修改文件,則加入參數-i
三、總結
本文主要整理了正則表達式與sed的基本用法,後續將繼續整理awk的基本用法。