sed 的概念及相關例子

一、sed的概念:

sed意爲流編輯器(Stream Editor),Shell腳本和Makefile中作爲過濾器使用非常普遍,也就是 把前一個程序的輸出引入sed的輸入,經過一系列編輯命令轉換爲另一種格式輸出。sedvi都源於早期UNIXed工,所以很多sed命令和vi的末行命令是相同的。
sed命令行的基本格式爲:
sed option 'script' file1 file2 ...
sed option -f scriptfile file1 file2 ...
sed處理的文件既可以由標準輸入重定向得到,也可以當命令行參數傳入,命令行參數可以一次傳入多個文件,sed會依次處理。 sed的編輯命令可以直接當命令行參數傳入,也可以寫成一個腳本文件然後用-f參數指定,編輯命令的格式爲
/pattern/action
其中pattern是正則表達式,action是編輯操作。sed程序一行一行讀出待處理文件,如果某一行與pattern匹配,則執相應的action,如果一條命令沒有pattern只有action,這個action將作用於待處理文件的每一行。
sed是一種在線編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩衝區中,稱爲模式空間pattern space),接着sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。接着處理下一行,這樣不斷重複,直到文件末尾。文件內容並沒有改變,除非你使用重定向存儲輸出。sed主要用來自動編輯一個或多個文件:簡化對文件的反覆操作。

 

 二、命令和選項

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

命令

a\ : 在當前行後添加一行或多行。多行時除最後一行外,每行末尾需用“\”續行

c\ :用此符號後的新文本替換當前行中的文本。多行時除最後一行外,每行末尾需用”\"續行

i\ :在當前行之前插入文本。多行時除最後一行外,每行末尾需用”\"續行 d刪除行

h : 把模式空間的內容複製到暫存緩衝區

H : 把模式空間的內容追加到暫存緩衝區

g : 把暫存緩衝區的內容複製到模式空間,覆蓋原有的內容

G: 把暫存緩衝區的內容追加到模式空間裏,追加在原有內容的後面

l : 列出非打印字符

p : 打印行

n : 讀入下一輸入行,並從下一條命令而不是第一條命令開始對其的處理

q : 結束或退出sed

r : 從文件中讀取輸入行

! : 對所選行以外的所有行應用命令

s : 用一個字符串替換另一個

g : 在行內進行全局替換

w : 將所選的行寫入文件

x : 交換暫存緩衝區與模式空間的內容

y : 將字符替換爲另一字符(不能對正則表達式使用y命令)

 

選項

-e : 進多項編輯,即對輸入行應用多條sed命令時使用

-n : 取消默認的輸出

-f :指定sed腳本的文件名

8. 退出狀態

sed不像grep樣,不管是否找到指定的模式,它的退出狀態都是0。只有當命令存在語法錯誤時, sed的退出狀態纔不是0。

 

sed在正常情況下,將處理的行讀入模式空間( pattern space),腳本中的“sedcommandsed命令) 就一條接着一條進行處理,直到腳本執完畢。然後該行被輸出,模式( pattern space)被清空;接着,再重複執剛纔的動作,件中的新的一行被讀入,直到文件處理完畢

一般情況下,數據的處理只使用模式空間( pattern space),按照如上的邏輯即可完成主要任務。但是某些時候,使用通過使用保持空間( hold space),還可以帶意想不到的效果。
模式空間:可以想成工程裏面的流水線,數據之間在它上面進行處理。
保持空間:可以想象成倉庫,我們在進行數據處理的時候,作爲數據的暫存區域。
正常情況下,如果不顯示使用某些高級命令,保持空間不會使用到!
sed命令:
+ g: [address[,address]]g hold space中的內容拷貝到pattern space中,原來pattern space裏的內容清除
+ G: [address[,address]]G hold space中的內容appendpattern
space\n
+ h: [address[,address]]h pattern space中的內容拷貝到hold space中,原來的hold space裏的內容被清除
+ H: [address[,address]]H pattern space中的內容appendholdspace\n
+ d: [address[,address]]d 刪除pattern中的所有行,並讀入下一新行到pattern
+ D: [address[,address]]D 刪除multiline pattern中的第一行,不讀入下一行
+ x 交換保持空間和模式空間的內容
如下例子:
1. 給每行結尾添加空行

wKiom1duIgyyqllSAAAiioFaTgY373.png

2. sed模擬出tac的功能(倒序輸出)

wKiom1duIiazChHqAAAg9vitkAk951.png-wh_50


1!G1不執“G”命令,從第2行開始執。 $!d,最後一行不刪除(保留最後1行)
3. 追加匹配行到文件結尾

wKioL1duIjmwpupNAAAuAa7GGwU378.png-wh_50 

4.行列轉化

wKioL1duIkmS-5xtAAAZkN5l-v8039.png


H表把pattern space 的內容追加到hold space中去, H可以帶一個地址,這裏用的是$,表到文件的末尾,然後用x將之取到pattern space中,把\n替換成空格再打印即可。
5.求1-100的和

wKiom1duIl7BnY_aAAA6vCDV2nI968.png6. 打印奇偶數行

wKiom1duIm2TSTBuAAAZEHzId0Q120.png-wh_50

7.1-100的和

wKiom1duIpKB2IMLAAAtPw1B2zM734.png


:a表標籤aba表跳轉到a標籤, $表最後一行,!表示不做後續操作,所以, $!ba表示最後一行不跳轉到a標籤,結束此次操作。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章