Sed 流文本編輯器

(一)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裏的內容被清除
H 將pattern space中的內容append到hold space\n後
g 將hold space中的內容拷貝到pattern space中,原來pattern space裏的內容清除
G 將hold space中的內容append到pattern space\n後
x 交換模式空間和保持空間的內容

總結如下表:

名稱

命令

說明

保存(Hold)

h/H

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

取回(Get

g/G

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

交換(Exchange

x

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

(三)Sed命令執行流程

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

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

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

1 讀入新的一行內容到緩存空間;

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

3 如果不匹配,則忽略後續的編輯命令,回到第2步繼續取出下一條指令;

4 如果匹配,則針對緩存的行執行後續的編輯命令;完成後,回到第2步繼續取出下一條指令;

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

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

如下圖所示:

(四)Sed命令地址的選擇

(一)‘ script ’ :分爲地址和命令

地址定界:

1 不給地址:對全文進行處理

2 單地址:

  num:指定的行

  $ 最後一行,

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

3地址範圍:

num1num2

num1+num2

/pat1//pat2/

num/pat1/

4 步進

1~2奇數行

2~2偶數行

PS: 如果地址後面有一個感嘆號(!),則將編輯命令應用到不匹配該地址的所有行

 

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