文本處理工具sed的高級用法

在上一章,我們學習了sed的一些基本用法,利用這些基本用法我們已經可以解決文本處理中遇到的絕大部分問題,但要想更加利用好sed這個工具,我們還需要學習下它的一些高級用法。

本節索引

一、模式空間與保持空間

二、sed高級用法

三、示例分析

 

在上一章,我們學習了sed的一些基本用法,利用這些基本用法我們已經可以解決文本處理中遇到的絕大部

分問題,但要想更加利用好sed這個工具,我們還需要學習下它的一些高級用法。

c945a2f105a803f14cfb695cca60bf2f

 

一、模式空間與保持空間:

我們知道sed工作機制是每次讀取一行文本至模式空間(pattern space)中,在模式空間中完成處理,將

處理結果輸出至標準輸出設備;在模式空間中處理一行內容后會繼續處理下一行,那么對于處理過的行可

能還有其他的處理,因此可以把處理過的行傳送至一個叫保持空間(hold space)中,然后在后續的處理中

再次傳送回模式空間中。這就類似加工車間和倉庫的概念,好比模式空間是加工車間,保持空間就是倉

庫,不過這里的倉庫存儲的都是些半成品的產品。

二、sed高級用法:

Sed工具支持一些高級的命令來運用到保持空間中,這些高級命令有:

P:打印模式空間開端至\n內容,并追加到默認輸出之前 ?

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

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

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

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

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

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

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

d: 刪除模式空間中的行 ?

D:如果模式空間包含換行符,則刪除直到第一個換行符的模式空間中的文本,

并不會讀取新的輸入行,而使用合成的模式空間重新啟動循環。如果模式空間

不包含換行符,則會像發出d命令那樣啟動正常的新循環。

三、示例分析:

以下我們均以該文檔為例:

文檔

例1:cat test2.sed |sed ‘G’

解析:由于保持空間初始默認為空,所有將空行追加到每行的模式空間中輸出,等同在每行的

后面添加一個空行。

例6

例2:cat test2.sed |sed ‘g’

解析:g和G的區別在,g為覆蓋模式空間,G為追加至模式空間,由于g默認為空,將每行的模式空間都覆

蓋為空行輸出,所以表現為5個空行。

例7

例3:cat test2.sed |sed ‘$!d’

解析:$表示尾行,$!d則表示除了尾行都執行刪除。

例5

例4:cat test2.sed |sed ‘n;d’

解析:n將第一行讀入模式空間輸出,并將下一行即第二行覆蓋至模式空間并刪除,如此循環,最終表現為

只顯示文本的奇數行。

例9

例5:cat test2.sed |sed ‘N;D’

解析:N將第二行追加至第一行的模式空間中,D刪除模式空間內的第一行;對第二行執行命令,將第三行追加至第二行的模式空間內,并刪除模式中的第一行;如此循環,最后只輸出最后一行文本。

例3

例6:cat test2.sed |sed ‘$!N;$!D’

解析:’$!N;$!D’即對文本中除了最后一行支持’N;D’操作,由例外5可知,除了最后一行執行’N;D’操作,得出

結果為只輸出倒數第二行,最后一行文本不處理,默認輸出,所有最后結果輸出倒數兩行的文本。

例4

例7:cat test2.sed|sed -n ‘n;p’

解析:對第一行執行操作,n選項將第二行覆蓋至模式空間,在第一行和第二行的默認輸出后追加打印出來,-n取消默認輸出,如此循環,最后得出文本的偶數行。

例1

例8:cat test2.sed|sed -n ‘1!n;p’

解析:與例7相比,例8為對除了第一行的其他行執行例7的操作,則最后的結果也為得出文本的奇數行。

奇數行

例9:cat test2.sed |sed ‘/^$/d;G’

解析:^$為表示地址定界匹配到的空行,d將空行刪除,G在每行的文本后添加一個空行;最后的輸出結果即:刪除文本內的空行,并在每行后追加一行空行。

例8

例10:cat test2.sed |sed ‘1!G;h;$!d’

解析:1!G表示除了第一行,都執行將保持空間的內容追加至模式空間并輸出,h命令使上一個模式空間內容將G覆蓋,最后$!d只保留對最后一行的執行結果,具體表現為:

對第1行只進入模式空間默認輸出,第2行將上一個模式空間內容(即第1行文本)覆蓋至保持空間,共同進入模式空間(包含第2至1行文本)并輸出;第3行將上一個模式空間內容(即第2至1行文本)覆蓋至保持空間,共同進入模式空間(包含第3至1行文本)并輸出;如此循環…….對第5行將上一個模式空間內容(第4至1行)覆蓋至保持空間,共同進入模式空間(包含5至1行)輸出;最后$!d除了最后一行的其他行的模式空間內容都刪除,最后只留最后一行的執行結果,即將文本倒序輸出。

例2

例11:cat test2.sed |sed -n ‘1!G;h;$p’

解析:與例10相比,最后的$p只打印最后一行的模式空間內容(第5至1行),-n取消所有默認輸出,得出的結果與例10相同,倒序將文本輸出。

例10

 

 

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/96587

(3)
wangxczwangxcz
上一篇 2018-04-19
下一篇 2018-04-20

相關推薦

  • 小白加薪升職記第一次筆記

    選擇了馬哥,你就站在了技術的前端。

    2018-05-12
  • 用戶管理

    用戶管理 注意:用戶是通過UID來確定身份的,比如root之所以為管理員就是因為root的UID是0。在centos6上系統用戶是1-499,普通用戶是500以上的;而在centos7上系統用戶是1-999,普通用戶是1000以上。系統用戶默認不登錄。 注意跟用戶相關的命令只有管理員賬戶才有權限 需要用到的命令:useradd usermod userdel…

    Linux筆記 2018-04-08
  • VIM編輯器用法大全

    文本編輯工具 語法:vim 參數 文件 文本編輯種類: 行編輯器:sed 全屏編輯器:nano,vi,vim – Vi Improved vim編輯器三大模式 編輯模式, 輸入模式: 末行模式: 內置的命令行接口; 模式轉換: 編輯模式 — > 輸入模式 : i : 在光標所在處輸入 a : 在光標所在處的后方輸入 o : 在光…

    2018-04-08
  • LAMP的實現

    php的兩種工作模式一種以模塊方式;一種以fcgi方式

    2018-06-23
  • 使用Systemd把自作腳本服務化(加入開機啟動)

    Systemd的出現,使得自己編寫的腳本可更容易的添加進系統服務,進而實現開機啟動。

    例如,我們可以把最簡單的hello world腳本進行擴展,將其添加進系統服務,使之開機自啟動。

    Linux筆記 2018-06-12
  • Linux巧用dd密令測試磁盤的讀寫能力

    dd if=/dev/zero of=/data/test.txt bs=4k count=100000
    dd if=/dev/sda1 of=/dev/null bs=4k count=1000000000
    只是粗略計算方法!

    Linux筆記 2018-03-31
欧美性久久久久