學了sed,覺得模式空間和暫存空間比較亂 整理一下 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
sed模式空間和暫存空間的區別
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.