流編輯器Sed(Stream Edit)詳解

流編輯器Sed(Stream Edit)詳解

 

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

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

 

Sed的工作原理

Sed從文件開頭逐行處理文件或輸入,并將結果輸出到屏幕上。Sed 將當前處理的行放在一個叫模式空間的臨時緩存區,在對其進行sed命令編輯后,就將結果輸出到屏幕上(除非sed命令刪除這一行或取消打?。ed每處理完一行就將其從模式空間中刪掉,然后將下一行讀入空間,進行處理和顯示。處理完文件的最后一行后,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
下一篇 2016-08-22

相關推薦

  • 馬哥教育網絡班21期+第6周課程練習

    請詳細總結vim編輯器的使用并完成以下練習題 1、復制/etc/rc.d/rc.sysinit文件至/tmp目錄,將/tmp/rc.sysinit文件中的以至少一個空白字符開頭的行的行首加#; [root@localhost ~]# cp /etc/rc.d/rc.sysinit /tmp/ [root@localho…

    Linux干貨 2016-08-15
  • pam_mysql認證ftp虛擬用戶賬號,且擁有不同的權限

    關防火墻:#systemctl stop firewalld                #setenforce 0 #yum install mariadb.server #yum install mariadb-d…

    Linux干貨 2017-06-07
  • 關于大型網站技術演進的思考(八):存儲的瓶頸(8)

    原文出處: 夏天的森林  在開始本篇主要內容前,我們一起看看下面的幾張截圖,首先是第一張圖,如下圖所示: 這是一家電商網站的首頁,當我們第一次打開這個首頁,網站會彈出一個強制性的對話框,讓用戶選擇貨物配送的地址,如果是淘寶和京東的話,那么這個選擇配貨地址的選項是在商品里,如下圖是淘寶的選擇配送地點: 下圖是京東選擇配貨地點: 那么圖一跟京…

    2015-03-11
  • 關于大型網站技術演進的思考(六):存儲的瓶頸(6)

    原文出處: 夏天的森林  在講數據庫水平拆分時候,我列出了水平拆分數據庫需要解決的兩個難題,它們分別是主鍵的設計問題和單表查詢的問題,主鍵問題前文已經做了比較詳細的講述了,但是第二個問題我沒有講述,今天我將會講講如何解決數據表被垂直拆分后的單表查詢問題。 要解決數據表被水平拆分后的單表查詢問題,我們首先要回到問題的源頭,我們為什么需要將數…

    2015-03-11
  • Shell腳本編程入門

    認識Shell Shell原意為貝殼 Linux系統中的shell是一個特殊的應用程序,它介于操作系統內核與用戶之間,充當一個“命令解釋器”的角色,負責接收用戶輸入的操作指令(命令)并進行解釋,將需要執行的操作傳遞給內核執行,并輸出執行結果。 可以使用命令查看當前使用的是哪種shell以及當前Linux系統中都支持哪些shell種類。   查看當前…

    Linux干貨 2016-08-12
  • 馬哥教育網絡班N22期+第3周課程練習

    馬哥教育網絡班N22期+第3周課程練習 1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登錄多次,則只顯示一次即可。 示例: [root@Red Hat Enterprise Linux Desktop]# who | cut -d' &#039…

    Linux干貨 2016-08-29
欧美性久久久久