Linux shell腳本之 Sed 簡介 正則表達式

Sed簡介
sed是一款輕量級流編輯器,是stream editor的簡寫。由於sed是以行爲單位進行編輯文件 , 因此也稱爲行編輯器。它無需直接編輯資料,能夠將編輯工作自動化。


sed工作方式:
由標準輸入讀取編輯文件,讀入一行或指定行放到模式空間,然後將所有編輯指令逐一對模式空間的內容進行編輯,之後將結果輸出到標準輸出,同時清除模式空間。接下來再將下一行資料讀入模式空間,如此重複之前的操作,直到最後一行,流編輯器停止。源文件不變


Ps:
1、模式空間爲讀入行所在的緩存,sed對文本行進行的處理都是在這裏進行的
2、一次操作一行, 按順序逐行應用命令
3、sed命令執行與返回數據幾乎同時進行的,在處理每一行數據的將同時就顯示結果
4、文件內容存在模式空間,並沒有改變,除非使用重定向存儲輸出,因而不會修改原文件


語法:
由編輯指令與文件組成
1、# sed [sed選項] 'sed命令' 要修改的文件 > 新文件
2、# sed [sed選項] -f sed腳本 要修改的文件
3、# sed腳本 [sed選項] 要修改的文件


參數(sed選項):
-e command:--expression=command:進行多項編輯,表示將後續的字符串解析爲sed編輯命令,對輸入行應用多條sed命令時使用。
    # sed -e '1,5d' -e 's/boy/girl/' dodo
    # sed --expression='1,5d' --expression='s/boy/girl/' dodo
-e script-file:--expression=script-file:調用指定的sed腳本文件來處理輸入的文本文件
-f script-file:--filer=script-file:調用指定的sed腳本文件來處理輸入的文本文件
-h:--help:打印幫助
-i:直接修改讀取的源文件(默認不修改源文件)
    也可以先備份源文件然後再修改,格式如下:
    # sed -i.bak '1d' filename
-n:--quiet, --silent:取消默認的輸出,僅打印匹配模式的行(默認輸出所有內容)
-r:sed的動作支持延伸型正規表示法的語法。(默認爲基礎正規表示法語法)
-V:--version:顯示版本信息


sed命令
a\ :     在定位行號後面加入一行或多行文本。(加入多行時除最後一行每行末尾需用"\"續行)
b lable: 將執行的指令跳至由":"建立的參考位置,如果不存在參考位置則跳轉到腳本的末尾
c\:      用新的文本替換定位行的文本。
d:       刪除定位行
D:       刪除模式空間內的第一行
g:       把當前保持緩衝區中的內容複製到模式空間,替換掉了模式空間中當前行的內容
G:       把當前保持緩衝區中的內容追加到模式空間,追加到了模式空間的當前行後
h:       把模式空間的內容複製到當前保持緩衝區中,把原來暫存緩衝區的內容清除,添加新內容
H:       把模式空間的內容複製到當前保持緩衝區中,追加在保持緩衝區中原有內容的後面
i\:      在定位行號前面插入一行或多行文本。
l:       以可見的嚴格的形式列出當前模式空間中的內容
n:       讀取下一個輸入行,用下一個命令處理新的行
N:       追加下一個輸入行到模式空間。
p:       打印匹配行
P:       打印模式空間的第一行
q:       第一個模式匹配完成後就退出Sed
r file:  從文件中讀取輸入行
s:       用一個字符串替換另一個字串。(默認爲替換每一行中的第一個)
t label: 如果s指令發生替換操作成功,則跳到":"標記的地方,即使已經讀入輸入的最後一行,如果沒有沒有標記則到腳本末尾
T label: 如果s指令發生替換操作失敗,則跳到":"標記的地方,即使已經讀入輸入的最後一行,如果沒有沒有標記則到腳本末尾
w:       將當前模式空間中的全部內容寫入到文件中
W:       將當前模式空間中的第一行寫入到文件中
x:       交換模式空間和文本的內容
y:       轉換字元,把一個字符翻譯爲另外的字符(但是不用於正則表達式)
: label: 建立參考位置
{} :     有相同位址參數的指令組
#:       把註釋擴展到下一個換行符之前
=:       顯示文件行號
!:       不執行選中行的命令,只對所選行以外的行應用命令

元字符集
sed支持特殊元字符,來進行模式查找、替換
^:          行首定位符。如:/^doiido/匹配所有以doiido開頭的行
$:          行尾定位符。如:/doiido$/匹配所有以doiido結尾的行
^$:         表示空白行
.:          匹配換行符以外的字符。如:/d...do/ 匹配d後面接3個任意字符,然後do。
*:          匹配零個或多個前導字符。如:/doiido*/ 匹配所有以doiid開頭,後面跟零個或多個o的行
[]:         匹配指定字符組內的任一字符。如:/[Dd]oiido/ 匹配所有包含doiido或Doiido的行
[^]:        匹配不在指定字符組內的任一字符。如:/[^Dd]oiido/ 匹配所有不是以D或者d開頭的但是以oiido結尾的行
\(..\):     保存已匹配的字符。如:s/\(hello\)doiido/\1baby 這裏把hello保存爲標籤1,如果發現hellodoiido則替換成helloboy,最多可以定義9個標籤
&:          保存查找字符串用來替換其他字符串。如:s/doiido/--&--/,符號&代表查找字符串,doiido將變成--doiido--
\<:         詞首定位符。如:/\<doiido/ 匹配所有包含有以doiido開頭的單詞的行。 
\>:         詞尾定位符。如:/doiido\>/ 匹配所有包含有以doiido結尾的單詞的行。
x\{m\}:     連續m個x。如:/2\{8\}/ 匹配所有包含連續8個2的行。 
x\{m,\}:    至少m個x。如:/2\{8,\}/ 匹配所有包含至少連續8個2的行。
x\{m,n\}:   至少m個x,但不多於n個。如:/2\{6,8\}/ 匹配所有包含連續6個到8個2的行。
Ps:匹配元字符$前,必須使用反斜線\屏蔽其特殊含義。比如/\$/


字符類擴展:
[]:          可以和"-"配合使用
[a-z]:       匹配所有的小寫字母
[0-9]:       匹配所有的數字
[:space:]:   匹配空格
[:alnum:]:   匹配字母數字 [a-z A-Z 0-9]
[:alpha:]:   匹配字母 [a-z A-Z]
[:blank:]:   匹配 空格或製表鍵
[:cntrl:]:   匹配 任何控制字符
[:digit:]:   匹配數字 [0-9]
[:graph:]:   匹配任何可視字符(無空格)
[:lower:]:   匹配小寫 [a-z]
[:print:]:   匹配非控制字符
[:punct:]:   匹配標點字符
[:space:]:   匹配空格
[:upper:]:   匹配大寫 [A-Z]
[:xdigit:]:  匹配十六進制數字 [0-9 a-f A-F]

字符類例子:
^[0-9]:          表示行第一個字符爲任意數字
^[0-9]*:         表示行首包含任意個數的數字
[0-9][0-9]*$:    表示行尾包含至少2個數字
s/\.$//g :       刪除以句點結尾的行的句點
s/^[ ][ ]*//:    刪除行首的任意個空格
s/^.//:          刪除行首的第一個字符
s/^\///:         刪除行首的“/”字符
s/SP\(..\)//g:   刪除字符“SP”以及緊跟其後的兩個任意字符,“SPLLY”-->“Y”
^#/:             以 '#' 開始的任何行匹配
/}^/ :           將與以 '}'(無空格)結束的任何行匹配
/} *^/ :         將與以 '}' 後面跟有 零或多個空格結束的任何行匹配 
/[abc]/ :        將與包含小寫 'a'、'b' 或 'c' 的任何行匹配
/^[abc]/ :       將與以 'a'、'b' 或 'c' 開始的任何行匹配

位置參數:
在默認情況下,在sed編輯器中使用的命令應用於所有文本數據行。
如果僅想將某個命令應用於某一特定的數據行或一組文本數據行,則必須使用行尋址。
行尋址通過定址來定位你所希望編輯的行,是由數據,正則表達式或者二者結合的方式確定。行尋址的格式有如下幾種:
x                      x爲指定行號
$                      最後一行
x,y                    指定從x到y的行號範圍
/pattern/              查詢包含模式的行
/pattern/pattern/      查詢包含兩個模式的行
/pattern/,x            從與pattern的匹配行到x號行之間的行
x,/pattern/            從x號行到與pattern的匹配行之間的行
x,y!                   不包括x和y行號的行
位址參數的個數 : 
當只有1個位址參數時,表示只有符合位置參數的資料行才編輯
當有2個位址參數時,如x,y時,表示對x到y的行號範圍資料區執行編輯。(包括x和y)


引號語法
1、單引號下,不會對$和後引號`進行解釋和執行,即把這兩個月當成普通字符
2、雙引號下,美元符會被展開爲變量或參數的值,後引號中的命令被執行並以輸出的結果代替後引號中的內容。
因此平時要使用單引號'',使用變量時使用雙引號""
使用變量時:# sed "/$hello/d" dodo



sed退出狀態:
1、不管是否找到指定的模式,退出狀態都是0。
2、當命令存在語法錯誤時,sed的退出狀態不是0。



轉義:
如果需要使用到斜槓"/",就需要先對其轉移,轉義一般有以下兩種
1:[/]
2:\/


單行使用多條語句
1、在命令之間使用分號
# sed -n '=;p' dodo 

2、使用大括號
# sed -n '3{
> =
> p}' dodo


3、使用-e參數
# sed -n -e '=' -e 'p' dodo 

4、使用腳本文件,然後使用-f引用
# sed -f scirpt dodo

5、bash shell中可以使用次提示符''
# sed -i '
>s/boy/girl/
>s/hello/byebye/' data


其他sed使用注意
1、如果不使用地址,命令將應用到所有行
2、默認情況只會替換各行中首次出現的文本,如果一行中有多個需要替換,則需要替換標記
3、如果要定位一特殊字符,則必須使用"\"或者"[]"屏蔽其特殊含義


========================腳本==========================
腳本:Sed腳本就是寫在文件中的一列sed命令,啓動Sed時以-f選項引導腳本文件名。

腳本工作方式:
執行腳本時,sed先將輸入文件中第一行復制到模式空間,然後對其執行腳本中所有的命令。一行處理完畢後,sed再複製文件中下一行到模式空間,對其執行腳本中所有命令。直到最後一行。

腳本注意項:
1、腳本中,在命令的末尾不能有任何空白或文本
2、如果在一行中有多個命令,要用分號分隔。
3、以#開頭的行爲註釋行,且不能跨行。


腳本格式:
#!/bin/sed -f
command1
command2



腳本實例:
# cat test.sed
#!/bin/sed -f
/hello/a\
hi boy doiido
2i\
you are great


添加權限並執行
# chmod u+x test.sed
# ./test.sed dodo





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章