概述
經過上篇對正則表達式和grep相關內容的學習,我們對文本處理有了一個初步的認識,本篇將簡要介紹一下文本處理三劍客之sed。具體分為以下幾個部分:
1、sed原理概述
2、sed命令詳解
第一部分 sed原理概述
1、sed是什么
sed是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,稱為模式空間,接著用sed命令處理緩沖區中的內容,處理完成后,如果有需要進一步處理,就把模式空間的內容送到保持空間,如果不需要進一步處理,把模式空間的內容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容并沒有改變,除非你使用重定向存儲輸出或者使用-i選項指定修改原文件。 sed主要用來自動編輯一個或多個文件,簡化對文件的反復操作,編寫轉換程序等。
2、sed的模式空間和保持空間的理解
模式空間和保持空間,實際上就是sed用來完成數據處理的兩段內存空間,其中模式空間用來存儲從文檔中讀取出來的數據,根據指定的處理動作完成對數據的處理,如果在模式空間的數據一次處理后,無法滿足要求或需要后續的行進行配合處理,就需再將該行數據放到保持空間,根據需要從模式空間和保持空間之間調度數據,完成更高一級的文件處理動作
3、sed工作原理
第二部分 sed命令詳解
1、sed命令語法格式:
語法:sed [OPTION]…'SCRIPT' FILE…
SCRIPT:地址定界和編輯命令的集合
常用選項:
-n 不輸出模式空間的內容至屏幕,也就是沒被模式匹配到的行,不輸出到屏幕(不指定的話,默認是輸出到屏幕)
一般如果編輯命令不是d,都應該指明該選項
-e SCRIPT 可以實現多個SCRIPT一起編輯(默認只能用一個SCRIPT)
-f /PATH/TO/FILE 將各個SCRIPT寫到文件中,然后利用-f 導入sed,進行處理。該文件中的格式為每行一個編輯命令
-r 表示支持使用擴展正則表達式
-i 表示直接編輯原文件
sed –iSTRING ‘s/dog/cat/g’ pets可以實現在改變原文件時,將原文件備份一份到原文件目錄下取名為源文件名后跟指定的STRING為文件名的文件
2、sed中的地址定界
<1>空地址:表示對全文處理
<2>單地址:表示只對指定行進行處理
數字:表示指定的行
/PATTERN/:表示被此模式匹配到的每一行
$ 最后一行
<3>地址范圍
數字1,數字2 表示從第幾行到第幾行之間所有的行,包括數字指定的行本身
數字1,+數字2 表示從第幾行開始,往后的多少行
數字,/PATTERN/ 表示從第幾行開始,到第一次能被模式匹配到的行結束
/PATTERN1/,/PATTERN2/ 表示第一次能被模式1匹配到的行開始,到第一次能被模式2匹配到的行結束
<4>步進長度表示法:~
1~2:表示從第1行開始,每次步進2(此例子表示的是奇數行)
2~2:表示從第2行開始,每次步進2(此例子表示的是偶數行)
地址定界示例:
3、sed中的編輯命令
d 表示刪除(此命令一般不能加-n選項,除此命令之外的其他命令都應該加上-n選項)
p 顯示能夠被匹配到的模式空間的內容(一般要加上-n選項)
例如:sed ‘1~2p’ /etc/fstab
表示顯示全部的內容,且奇數行顯示兩次,因為默認會顯示模式空間中的內容
sed -n ‘1~2p’ /etc/fstab表示只顯示奇數行的內容
a \TEXT 加在后面,表示在模式匹配到行后面追加指定的文本TEXT,支持使用\n(換行符)實現多行插入
i \TEXT 加在前面,表示在模式匹配到行前面加上指定的文本TEXT,支持使用\n(換行符)實現多行插入
c \TEXT 把匹配到的整行,替換為此處指定的文本TEXT
w /PATH/TO/FILE 保存模式空間中被模式匹配到的行另存為指定文件
r /PATH/TO/FILE 讀取指定文件的內容,至當前文件中被模式匹配到的行后面,文件合并
= 為模式匹配到的行,打印行號,在匹配到的行的上方另起一行標注行號
! 條件取反,!的位置在地址定界之后,編輯命令之前
s/// 查找替換,其分隔符可執行指定,常用的有s@@@,s###
支持替換標記:
g 表示全局替換(默認表示只替換第一次出現的地方)
w /PATH/TO/FILE 將替換成成功的結果保存至指定文件
p 顯示替換成功的行
4、sed中的高級編輯命令
h 表示把模式空間中的內容覆蓋至保持空間中
H 表示把模式空間中的內容追加至保持空間中
g 表示把保持空間中的內容覆蓋至模式空間中
G 表示把保持空間中的內容追加至模式空間中
x 表示把模式空間中的內容與保持空間中的內容互換
n 表示讀取匹配到的行的下一行至模式空間中,覆蓋原行
N 表示讀取匹配到的行的下一行至模式空間中,追加到原行后面
d 表示刪除模式空間中的行
D 表示刪除多行模式空間中的所有行
示例:sed ‘1!G;h;$!d’ /etc/fstab 相當于逆序顯示文件內容
分析此命令的過程:
幾個編輯動作的意思:如果不是第一行,就做G操作,然后做h操作,然后如果不是最后一行,就做d操作
第1行,因為是第一行,不做G操作,然后做h,將第一行的內容覆蓋到保持空間,然后不是第一行,刪除模式空間的內容,模式空間沒內容
第2行,因為不是第一行,做G操作,將剛才保持空間中的第一行的信息追加到模式空間,此時模式空間有第2行和第1行,然后做h操作,將模式空間的第2行和第1行覆蓋到保持空間,此時保持空間有第2行和第1行,然后做d操作,刪除了模式空間的所有內容
第3行,做G操作,故模式空間有了第3行,第2行和第1行,然后再進行h操作,此時保持空間中的內容有第3行第2行第1行,然后刪除模式空間
….
最后一行:做G操作,把保持空間的內容追加到模式空間,然后再做h,把模式空間的內容覆蓋到保持空間,然后由于是最后一行,不做d操作,故,此時模式空間的內容是最后一行…第一行 ,逆序排序了
然后sed的默認動作是把模式空間的內容輸出,故顯示的結果是將文件逆序排序
sed ‘$!d’ FILE 表示顯示最后一行
sed ‘$!N;$!D’ FILE 顯示文件的最后兩行的內容
sed ‘/^$/d;G’ FILE 刪除原有的所有空白行,然后為每個非空白行后添加一個空白行
sed ‘n;d’ FILE 顯示奇數行
sed ‘G’ FILE 表示在原有的每行后面都加上一個空白行
原創文章,作者:M20-1倪文超,如若轉載,請注明出處:http://www.www58058.com/32100