Linux shell指令碼之 Sed 簡介 Regex

來源:互聯網
上載者:User

標籤:linux   shell   sed   Regex   

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:       第一個模式比對完成後就退出Sedr file:  從檔案中讀取輸入行s:       用一個字串替換另一個字串。(預設為替換每一行中的第一個)t label: 如果s指令發生替換操作成功,則跳到":"標記的地方,即使已經讀入輸入的最後一行,如果沒有沒有標記則到指令碼末尾T label: 如果s指令發生替換操作失敗,則跳到":"標記的地方,即使已經讀入輸入的最後一行,如果沒有沒有標記則到指令碼末尾w:       將當前模式空間中的全部內容寫入到檔案中W:       將當前模式空間中的第一行寫入到檔案中x:       交換模式空間和文本的內容y:       轉換字元,把一個字元翻譯為另外的字元(但是不用於Regex): 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編輯器中使用的命令應用於所有文本資料行。
如果僅想將某個命令應用於某一特定的資料行或一組文本資料行,則必須使用行定址。
行定址通過定址來定位你所希望編輯的行,是由資料,Regex或者二者結合的方式確定。行定址的格式有如下幾種:
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




Linux shell指令碼之 Sed 簡介 Regex

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.