sed模式空間和暫存空間的區別_linux shell

來源:互聯網
上載者:User

sed編輯器逐行處理檔案,並將輸出結果列印到螢幕上。sed命令將當前處理的行讀入模式空間(pattern space)進行處理,sed在該行上執行完所有命令後就將處理好的行列印到螢幕上(除非之前的命令刪除了該行),sed處理完一行就將其從模式空間中刪除,然後將下一行讀入模式空間,進行處理、顯示。處理完檔案的最後一行,sed便結束運行。sed在臨時緩衝區(模式空間)對檔案進行處理,所以不會修改原檔案,除非顯示指明-i選項。

與模式空間和暫存空間(hold space)相關的命令:

n 輸出模式空間行,讀取下一行替換當前模式空間的行,執行下一條處理命令而非第一條命令。
N 讀入下一行,追加到模式空間行後面,此時模式空間有兩行。
h 把模式空間裡的行拷貝到暫存空間。
H 把模式空間裡的行追加到暫存空間。
g 用暫存空間的內容替換模式空間的行。
G 把暫存空間的內容追加到模式空間的行後。
x 將暫存空間的內容於模式空間裡的當前行互換。
! 對所選行以外的所有行應用程式命令。

注意:暫存空間裡預設儲存一個空行。

下面是一些例子:

cat datafile
111111111111 aaa
222222222222 bbb
333333333333 ccc
444444444444 ddd
555555555555 eee
666666666666 fff

在每行後面加一空行:

sed 'G' datafile
111111111111 aaa

222222222222 bbb

333333333333 ccc

444444444444 ddd

555555555555 eee

666666666666 fff

aaa行被讀入模式空間,執行G,在此行後面追加一個空行,然後列印模式空間,其他行同理。

在匹配行後加一空行:

sed '/ccc/G' datafile
111111111111 aaa
222222222222 bbb
333333333333 ccc

444444444444 ddd
555555555555 eee
666666666666 fff

在匹配行前加入一個空行:

sed '/ccc/{x;p;x;}' datafile
111111111111 aaa
222222222222 bbb

333333333333 ccc
444444444444 ddd
555555555555 eee
666666666666 fff

命令執行前後暫存空間和模式空間的變化情況:

命令     暫存空間                                         模式空間
x           執行前:null 執行後:ccc\n              執行前:ccc\n 執行後:null
p          執行前:null 執行後:ccc\n              執行前:ccc\n 執行後:null 輸出一個空行
x          執行前:ccc\n 執行後:null              執行前:null 執行後:ccc\n 輸出ccc所在行

(註:把ccc所在行簡寫為ccc)

刪除偶數行:

sed '{n;d;}' datafile
111111111111 aaa
333333333333 ccc
555555555555 eee

執行n後列印第一行,然後讀入第二行執行d命令,即刪除此行;然後在執行n列印第三行,然後讀入第四行執行d命令,依此類推。

在偶數行後添加一新行:

sed '{n;G;}' datafile
111111111111 aaa
222222222222 bbb

333333333333 ccc
444444444444 ddd

555555555555 eee
666666666666 fff

執行 n 以後將第一行輸出到標準輸出以後,然後第二行進入模式空間,根據前面對 G 的解釋,會在第二行後面插入一個空行,然後輸出;再執行 n 將第三行輸出到標準輸出,然後第四行進入模式空間,並插入空行,依此類推。
相應的:sed '{n;n;G;}' datafile 表示在檔案的第 3,6,9,12,… 行後面插入一個空行。

將偶數行置空:

sed '{n;g;}' datafile
111111111111 aaa

333333333333 ccc

555555555555 eee

執行n後列印第一行,然後讀入第二行執行g命令,g命令用暫存空間內容(null)來替換當前模式空間,即第二行被置空。其它行依此類推。

合并偶數行到上一行:

sed '{N;s/\n/\t/;}' datafile
111111111111 aaa 222222222222 bbb
333333333333 ccc 444444444444 ddd
555555555555 eee 666666666666 fff

執行N,將第二行追加到模式空間的第一行後,此時模式空間用兩行,然後執行替換(s)將第一個分行符號替換成tab。其它行依此類推。

加行號,大致相當於cat -n datafile:

sed = datafile
1
111111111111 aaa
2
222222222222 bbb
3
333333333333 ccc
4
444444444444 ddd
5
555555555555 eee
6
666666666666 fff

sed = datafile |sed '{N;s/\n/\t/;}'
1 111111111111 aaa
2 222222222222 bbb
3 333333333333 ccc
4 444444444444 ddd
5 555555555555 eee
6 666666666666 fff

輸出檔案最後2行,相當於 tail -2 datafile

sed '{$!N;$!d;}' datafile
555555555555 eee
666666666666 fff

sed '{$!N;$!d;}' : 對檔案倒數第二行以前的行來說,N 將當前行的下一行追加到模式空間中以後,D 就將模式空間的內容刪除了;到倒數第二行的時候,將最後一行追加到倒數第二行下面,然後最後一行不執行 d(!對所選行-此處是最後一行,以外的行執行命令) ,所以檔案的最後兩行都儲存下來了。

將檔案的行反序顯示,相當於 tac 命令:

sed '{1!G;h;$!d;}' datafile
666666666666 fff
555555555555 eee
444444444444 ddd
333333333333 ccc
222222222222 bbb
111111111111 aaa

1!G表示除了第一行以外,其餘行都執行G命令;$!d表示除了最後一行以外,其餘行都執行d命令。

看一下sed '{1!G;h;$!d;}'命令執行過程中暫存空間與模式空間的變化:

處理行        命令         暫存空間                                                                          模式空間
第一行        h;d           執行前:null 執行後:aaa\n                                             執行前:aaa\n 執行後:null
第二行        G;h;d       執行前:aaa 執行後:bbb\n1111\n                                 執行前:bbb\n 執行後:null
最後一行    G;h          執行前:eee\n…aaa\n 執行後:fff\n…bbb\n\aaa\n       執行前:eee\n 執行後:fff\n…bbb\n\aaa\n

(註:把各個行簡寫了)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.