Sed 流文字編輯器

2021-09-02 22:34:02 字數 2961 閱讀 6306

(一)sed流文字編輯器介紹

sed (stream editor) 本質上是乙個編輯器,但是它是非互動式的,這點與vim不同;同時它又是面向字元流的,輸入的字元流經過sed的處理後輸出。這兩個特性使得sed成為命令列下面非常有用的乙個處理工具,同時sed能夠完美的配合正規表示式使用。

這裡先談一下互動式和非交戶式的編輯器。

vim:需要進到文字裡面進行操作。

sed:不需要進行到文字裡面進行操作。

而所謂流編輯器,是指sed每次只從檔案(或輸入)讀入一行,然後對該行進行指定的處理,並將結果輸出到螢幕(除非取消了螢幕輸出又沒有顯式地使用列印命令),接著讀入下一行。整個檔案像流水一樣被逐行處理然後逐行輸出。這個就是流編輯器。

最後,sed能夠非常完美的配合正規表示式使用。

(二 )sed流文字編輯器的格式

sed命令的格式:

sed [options] ' script' inputfile(s)
options是指sed的命令列引數,這一塊並不是重點,引數也不多。

script是指需要對輸入執行的乙個或者多個操作指令(instruction),sed會依次讀取輸入檔案的每一行到快取中並應用script中指定的操作指令,因此而帶來的變化並不會影響最初的檔案(注:如果使用sed時指定-i引數則會影響最初的檔案)。

同大多數linux命令一樣,sed也是從stdin中讀取輸入,並且將輸出寫到stdout,但是當filename被指定時,則會從指定的檔案中獲取輸入,輸出可以重定向到檔案中,但是需要注意的是,該檔案絕對不能與輸入的檔案相同。

如果操作指令很多,為了不影響可讀性,可以將其寫到檔案中,並通過-f引數指定scriptfile:

sed -f scriptfile filename
這裡有乙個建議,在命令列中指定的操作指令最好用單引號引起來,這樣可以避免shell對特殊字元的處理(如空格、$等)。這個建議同樣適用grep/awk等命令,當然如果有時候確實不適合使用單引號時,記得對特殊字元轉義。

sed選項:

–n 要讀取的行號,可以關閉自動列印

-e 執行多個sed 命令

-f 執行指令碼

-i 編輯檔案內容

-i.bak 編輯的同時創造.bak的備份

-r 使用擴充套件的正規表示式

sed命令

1 基本命令

p 列印當前模式空間的內容,追加到預設輸出之後 \n

d 刪除模式空間匹配的行,並進行下一輪迴圈

a 在匹配後追加文字,支援使用\n來實現多行追加

i 在匹配行前面加入文字

c 替換,把選定的行改為新的文字

w 儲存模式匹配的行,到新的檔案中。w/pattern/file

r 讀取檔案/一行,相當於在符合的行後面追加檔案/行。

2 替換命令:

s///:查詢替換,支援使用其它分隔符,s@@@,s###
g

在行內進行全域性替換 不加

g替換行內第乙個符合的字串。

3 高階命令

n 追加下一行內容到當前行\n後面

d 刪除\n 之前的內容

p列印當前模式空間開端至\n的內容,並追加到預設輸出之前

4  操作保持空間的命令

操作保持空間的命令如下所示:

h 將pattern space中的內容拷貝到hold space中,原來的hold space裡的內容被清除

g 將hold space中的內容拷貝到pattern space中,原來pattern space裡的內容清除

x 交換模式空間和保持空間的內容

總結如下表:

名稱

命令

說明

儲存(hold)

h/h將模式空間的內容複製或者追加到保持空間

取回(get)

g/g將保持空間的內容複製或者追加到模式空間

交換(exchange)

x 交換模式空間和保持空間的內容

(三)sed命令執行流程

無論是將操作指令通過命令列指定,還是寫入到檔案中作為乙個sed指令碼,必須包含至少乙個指令,否則用sed就沒有意義了。一般會同時指定多個操作指令,這時候指令之間的順序就顯得非常重要。而你的腦海中必須有這麼乙個概念,即每個指令應用後,當前輸入的行會變成什麼樣子。要做到這一點首先必須要了解sed的工作原理,要做到「知其然,且知其所以然」。

每條操作指令(instruction由pattern和procedure兩部分組成,pattern一般是用'/'分隔的正規表示式,而procedure則是一連串編輯命令(action)。

sed的處理流程,簡化後是這樣的:

1 讀入新的一行內容到快取空間;

2 從指定的操作指令中取出第一條指令,判斷是否匹配pattern;

5 當所有指令都應用之後,輸出快取行的內容;

6 回到第1步繼續讀入下一行內容;

如下圖所示:

(四)sed命令位址的選擇

(一)『 script 』 :

分為位址和命令

1 2

num:指定的行 $

最後一行,

/pattern/

:被此處模式所能匹配的每一行 3

num1

,num2

num1

,+num2

/pat1/

,/pat2/

num,/pat1/ 4

步進 1~2奇數行

2~2偶數行

ps:

sed流編輯器

sed預設不編輯原始檔,僅對模式空間中的資料做處理 而後,處理結束後,將模式空間中的內容列印至螢幕。sed options addresscommand file.用行,和命令一起來操作文字 options n 靜默顯示,不再顯示模式空間中的內容 i 直接修改原檔案 e 指令碼 e指令碼 可以同時執...

sed 流編輯器

sed 模式空間 預設不編輯原檔案,僅對模式空間中的資料做處理 而後,處理結束後,將模式空間列印至螢幕 sed options addresscommand file n 靜默模式,不再預設顯示模式空間中的內容 i 直接修改原檔案 e script e script 可以同時執行多個指令碼 f pa...

文字編輯器

include stdio.h include string.h include stdlib.h define len sizeof struct linetable struct linetable main 輸出並加入行號 display struct linetable head else ...