流編輯器Sed(Stream Edit)詳解

流編輯器Sed(Stream Edit)詳解

 

    Grep 、sed 和awk并稱為文本三劍客。使用Grep就可以很好的實現文本查找的功能,而且簡單有效。然而其卻無法直接對其進行編輯,sed的出現便解決了這一問題。

Sed被稱為流編輯器,它是一種新型的非交互式的文本編輯器,它逐行處理文件或輸入,并將結果輸出到屏幕上。Sed編輯沒有破壞性,它默認不會修改文件,除非使用選項主動修改。如果需要進行多項編輯任務,也可以把命令寫在一個叫sed腳本的文件里。

 

Sed的工作原理

Sed從文件開頭逐行處理文件或輸入,并將結果輸出到屏幕上。Sed 將當前處理的行放在一個叫模式空間的臨時緩存區,在對其進行sed命令編輯后,就將結果輸出到屏幕上(除非sed命令刪除這一行或取消打印)。Sed每處理完一行就將其從模式空間中刪掉,然后將下一行讀入空間,進行處理和顯示。處理完文件的最后一行后,sed便結束運行。

流編輯器Sed(Stream Edit)詳解 

sed之正則表達式

與grep一樣,sed在文件中查找模式時也要使用正則表達式和各種元字符。正則表達式是括在括在斜桿間的模式,用于查找和替換。

流編輯器Sed(Stream Edit)詳解 

如果要把正則表達式分隔符改成其他字符如c,只要在這個字符前加一個反斜桿,在字符后跟上正則表達式,再跟上這個字符即可,如:

流編輯器Sed(Stream Edit)詳解 

說明,如果斜桿本身是正則表達式的一部分,則需在其前加上反斜桿,以免和作用分隔符的斜桿混淆;或者使用如上方法將分隔符改成其他字符;如:

流編輯器Sed(Stream Edit)詳解 

流編輯器Sed(Stream Edit)詳解 

 

地址定界

地址定界用于決定對那些行進行編輯,地址的形式可以是數字、正則表達式或二者的結合。如果沒有指定地址,sed 將處理文件中的所有行。定界方法(#代表數字):

無地址

對全文進行處理

#

指定的第#行

$

代表最后一行

/PATTERN/

被此處模式所能夠匹配到的每一行

#1,#2

從#1行到#2行

#1,+#2

從第#1行向下共#2行

/PAT1/,/PAT2/

從第一個被PATTERN1匹配到的行開始到第 一個被PATTERN2匹配到的行及之間的所有行

#,/PATTERN/

從第#行開始到第一個能夠PATTERN匹配到的行的所有行

~

步進;    eg. 1~2:奇數行; 2~2:偶數行        

 

Sed用法

Sed命令的格式為:sed [OPTION]… {script-only-if-no-other-script} [input-file]…

其中腳本又由地址定界加編輯命令組成,地址定界指明對文件中的哪些行做編輯。編輯命令則說明做什么編輯操作,如增、刪、顯示。

常用選項

-n

取消默認輸出

-e

允許多項編輯

-f FILE

從指定文件FILE中讀取編輯腳本

-r

支持使用擴展正則表達式

-i[SUIFFIX]

直接編輯原文件,后綴SUFFIX若指明則添加此后綴備份

編輯命令

Sed命令告訴sed如何處理由地址界定指定的各輸入行,如果沒有指定地址,sed就會處理所有的行。Sed命令有:

p

顯示所匹配到的所有行

d

刪除所匹配到的行

i \TEXT

在匹配到的行前面追加新行,內容為TEXT,可使用\n追加多行內容

a\TEXT

在匹配到的行后面追加新行,內容為TEXT,可使用\n追加多行內容

c\TEXT

用新文本TEXT替換匹配到的行

w

將匹配到的行保存至指定文件中;w /PATH/TO/SOMEFILE

r

將指定的文件內容追加至匹配到的行后面;r /PATH/TO/SOMEFILE

=

在匹配到的行前面顯示行號,行號單獨占據一行

!

取反;    eg. 地址定界!編輯命令

q

退出

s

查找并替換,s/PATTERN/STRING/修飾符,模式可用RE,其分隔符可自定義,例如s@@@,s###等等(換行符,反斜線除外)。

    STRING:使用字符串定義替換的內容,可使用后向引用\1,\2,…;

    &:sed支持的元字符之一,引用前面PATTERN所匹配到的所有內容

替換標志

p:顯示替換成功的內容;

w /PATH/TO/SOMFILE:將替換成功的內容保存至指定文件當中;

i:查找替換時忽略大小寫;

g:全局替換,默認只替換每行第一個被PATTERN所匹配到的內容;

y:將字符替換為另一字符。

如果要使用多條命令,或者需要在某個地址范圍內嵌套地址,就必須用花括號括起來,每行只寫一個命令;或者用分號分隔一行中的多個命令。

流編輯器Sed(Stream Edit)詳解 

1到5行中包行etc的替換成大寫的ETC,然后把第4行刪除。用-e選項也可實現同樣的效果。

流編輯器Sed(Stream Edit)詳解 

第1至5行先刪除第3行再顯示。

Sed范例

下面以/etc/fstab/文件為例,對sed命令做示范

流編輯器Sed(Stream Edit)詳解 

1、打?。簆命令

命令p是打印,用于顯示模式空間中的內容。默認情況下,sed會把輸入行打印在屏幕上,選項-n可以取消默認打印。因此但選項-n與p命令同時出現時,sed可打印選定的內容。

流編輯器Sed(Stream Edit)詳解 

只打印1到3行

2、多重編輯:-e選項

流編輯器Sed(Stream Edit)詳解 

-e用于進行多重編輯。第一重刪除1-3行,第二重將行首為UUID的行的改成小寫的uuid。因為是逐行進行這兩項編輯,所以編輯的命令順序可能會影響結果。

3、插入:i命令

流編輯器Sed(Stream Edit)詳解 

在含etc的行下加如hello sed,\n表示換行;也可斜桿回車如下圖:blob.png

4、讀文件:r命令

流編輯器Sed(Stream Edit)詳解 

在第1行下讀入文件/etc/issue的內容

5、否定命令:!

流編輯器Sed(Stream Edit)詳解 

不刪除包含etc的行。

6、替換:s命令

流編輯器Sed(Stream Edit)詳解 

將所有包含0的行的所有0改成A,并且加g命令全局替換,不加g命令則只替換行里第一個0。

7、退出命令:q

退出命令表示退出,此命令將導致sed程序退出。

流編輯器Sed(Stream Edit)詳解 

打印完第五行后,q命令讓sed退出。

Sed高級命令

Sed執行時逐行將文件內容讀至模式空間,進行編輯后再輸出。然后刪除模式空間,讀入下一條,這樣直至最后一條。但是其實sed還有一個特殊的緩存空間叫保持空間或暫存緩沖區(holding buffer),使用h/H命令可以將模式空間中的內容復制并保存在保持空間,使用共g/G則可以將保持空間中內容放回模式空間,覆蓋,或追加模式空間當前行的后面。這樣便有了sed的一些高級的使用方法。其命令為:

h

把模式空間中的內容覆蓋至保持空間中

H

把模式空間中的內容追加至保持空間中

g

從保持空間取出數據覆蓋至模式空間

G

從保持空間取出內容追加至模式空間

n

讀取匹配到的行的下一行覆蓋至模式空間

N

讀取匹配到的行的下一行追加至模式空間

d

刪除模式空間中的行,開始下一循環

D

若模式空間無多行則同d;若有,則刪除模式空間所有行,并以此時的模式空間開始下一循環

x

把模式空間中的內容與保持空間中的內容進行互換

例:

流編輯器Sed(Stream Edit)詳解 

當讀入到包含etc的行時(第3行),將其放入保持空間,并刪除模式空間的內容;當再讀到包含dev的行時將保持空間中的內容即第3行放入模式空間后面。最后實現將第3行放到組后一行后面。

Sed的高級命令其實還有很多用法,如:

1、sed -n ‘n;p’FILE            顯示偶數行

2、sed ‘1!G;h;$!d’FILE       文件逆序顯示

3、sed  ‘$!N;$!D’FILE        顯示文件的最后兩行

4、sed  ‘$!d’FILE               打印最后一行

5、sed  ‘G’FILE                   每行后加一行空行

6、sed ‘g’FILE                    每一行換成空白行

7、sed  ‘/^$/d;G’FILE        把空白行刪除,并把每行后加一空白行

8、sed ‘n;d’FILE                 打印數行

9、sed -n ‘1!G;h;$p’FILE    逆序打印

 

Sed腳本編程

Sed腳本就是放在文件中的一列sed命令,使用選項-f后加文件名讀取腳本文件。Sed腳本中命令格式要求很特別。他要求命令的末尾不能有任何多余的空格或文本。如不命令不能獨占一行,則必須以分號結尾。不能使用引號,除非它是被查找的字符串的一部分。使用反斜桿即可實現換行。

執行腳本時,sed先將輸入文件中的第一行讀入模式空間,然后對其執行腳本中的所有命令。每行處理完畢再讀下一行直至最后一行。如果腳本語法有錯誤,sed腳本就會運行錯誤。范例:

流編輯器Sed(Stream Edit)詳解 

Sed腳本:1如果有包含etc的行則在其下加入文字”this is a…”;2在所有UUID開頭的行下面加一行空白行;3刪除最后一行。

流編輯器Sed(Stream Edit)詳解 

執行結果

原創文章,作者:beyond,如若轉載,請注明出處:http://www.www58058.com/38507

(0)
beyondbeyond
上一篇 2016-08-22 08:44
下一篇 2016-08-22 09:29

相關推薦

  • 管道及重定向

    管道及重定向 1、重定向 在Linux中有時我們在命令的執行過程中,不想將執行結果顯示到屏幕上,或者將其結果輸出到其他位置 這時就需要重定向來解決這個問題了 首先了解一下Linux中的3種I/O設備: 0:標準輸入 1:標準輸出 2:標準錯誤輸出 輸出重定向:> >> 輸入重定向: < << >:將標準輸出重定向到文…

    Linux干貨 2017-07-28
  • Linux系統啟動流程、內核及模塊管理、linux啟動故障排除和自制linux

    Linux系統啟動流程、內核及模塊管理 Linux系統的組成部分組成:內核+根文件系統(kernel+rootfs)內核(kernel): 進程管理(創建、調度、銷毀等)、內存管理、網絡管理(網絡協議棧)、驅動程序、文件系統、安全功能IPC:Inter Process Communication機制本地進程間通信機制:消息隊列、semerphor、shm(共…

    2016-09-29
  • 文本處理工具補充之sed命令

    sed:stream editor,行編輯器         sed命令工作原理:它在處理數據時,每次只處理一行,首先把當前處理的行存儲在臨時緩沖區中,我們稱這個緩沖區稱為“”模式空間“,接著用sed命令處理緩沖區中的內容,處理完后,把緩沖區中的內容送到屏幕上顯示出來,接著去處理…

    Linux干貨 2016-08-11
  • LVM work?。?!

    1、創建一個至少有兩個PV組成的大小為20G的名為testvg的VG;要求PE大小為16MB, 而后在卷組中創建大小為5G的邏輯卷testlv;掛載至/users目錄.     (1)查看分區大小 [root@localhost ~]# lsblk NAME   MAJ…

    Linux干貨 2016-09-01
  • 管理systemd

    管理systemd init(系統的第一個進程): CentOS 5: SysV initCentOS 6: UpstartCentOS 7: Systemd Systemd:系統啟動和服務器守護進程管理器,負責在系統啟動或運行時,激活系統資源,服務器進程和其它進程 Systemd新特性: 系統引導時實現服務并行啟動 按需啟動守護進程 系統狀態快照 自動化的…

    Linux干貨 2016-09-22
  • 重定向與管道

         本次內容    1.三種I/O設備    2.把I/O從定向入文件    3.命令tr    4.使用管道鏈接命令    5.tee   我們都知道程序是由:指令+數據    &n…

    2017-07-23
欧美性久久久久