天天看點

sed學習筆記

Sed 的基本用法1、sed介紹及工作流程:

很多時候我們在linux下面都需要編輯一些檔案。我們所使用的編輯器一般都是vi/vim。Vim屬于螢幕編輯器,所謂螢幕編輯器是說,我們編輯一個檔案的時候,需要把這個檔案打開,這樣存在兩個問題:1、因為我們需要打開檔案,是以如果說一個比較大的檔案,将會消耗很多記憶體;2、當我們編輯檔案的時候,必須要互動,這樣的話,如果我們在寫腳本的時候,是很難調用Vim。這個時候就需要使用其他的編輯器,sed就是其中的一種。

Sed屬于流編輯器,所謂的流編輯器是這樣的,sed在編輯檔案的時候,首先會把檔案的一行内容讀入記憶體,然後根據我們的需要來進行編輯。讀入記憶體的這部分,我們稱作是模式空間,修改完,會把模式空間的内容輸出到螢幕,然後把模式空間的内容清空。讀取下一行到模式空間。這樣的話就避免了一次性讀取整個檔案。

2、sed的基本指令:

sed的文法:

sed ‘範圍 操作指令’ file

如果範圍沒有指定的話,那麼将會對全文每行進行操作。

有時候我們需要指定操作範圍,指定範圍的方法有兩種:第一種是直接寫一個數字,表示對多少行進行操作:

注:首先介紹一個指令d,表示删除

sed學習筆記

上圖表示删除cc檔案的第二行。

sed學習筆記

上圖表示删除cc檔案的最後一行。

第二種是指明範圍的方式是正規表達式,如果我們使用正規表達式來表示範圍的話,必須使用//隔開,比如:

sed學習筆記

上圖表示删除以root開頭的行。

以上是對單行操作的,我們也可以對多行操作:

sed學習筆記

上圖表示删除第一行到第四行。除了使用數字表示範圍之外,還可以:

sed學習筆記

上圖表示删除包含root的行到第一次包含sync的行之間的所有行。

以上是所說的範圍,如果沒有指定範圍的話,将對全文進行操作。

還有其他指令:

S 表示替代的意思:

Sed ‘範圍 s/老字元/新字元/标記’ file

(在這裡老字元部分是支援正規表達式的,但是在新字元的位置是不支援正規表達式的,沒有什麼特殊字元,除了\n \&)

sed學習筆記

上圖表示把rhce替換成RHCA。因為沒有指定标記,所有隻能替換每行的第一個關鍵字。如果要替換所有内容或其他關鍵字,就要使用标記:

sed學習筆記

最後加上标記g,表示對每行的所有關鍵字都進行替換。

如果要替換每行的第二個關鍵字,可以用以下方式:

sed學習筆記

同理替換第n個關鍵字,即加上數字n。

sed學習筆記

上圖表示替換第二個到最後一個關鍵字。

sed學習筆記

上圖表示指定範圍為第一行,并替換第二個關鍵字(:号替換為--)。

我們在執行替換操作的時候,不一定非得使用//來隔開,可以使用其他任意字元,比如@或#等(隻能在s操作時有效):

sed學習筆記

& 替換字元部分是有意義,代表的意思是前面的關鍵字。

sed學習筆記

剛才提到兩個指令d和s,如果說我們對特定的範圍做多個操作的話,那麼我們需要把多個操作用{}括起來,操作之間用;隔開:

sed學習筆記

上圖表示首先把第一行的所有rhce替換成RHCA,然後把第一個RHCA替換成XXXX。

Sed讀取檔案的一行,然後操作,操作完成之後,會把結果顯示在螢幕上,如果想檢視模式空間中的内容的話,可以使用p:

sed學習筆記

上圖除了顯示正常的内容,還特别顯示了模式空間的内容。如果我們不想在螢幕輸出沒有編輯過的那些檔案,隻要給sed加上-n選項就可以:

sed學習筆記

如果要替換單個字元的話,可以使用y指令:

sed學習筆記

上圖表示替換第一行,字母c替換為字母z。(如果第一行有a和b的話,也分别替換為x和y)。

還有其他一些簡單的指令:

a\ 表示追加,在關鍵詞後面一行加上一行内容:

sed學習筆記

上圖表示在DEVICE這行的下面一行添加一行XXXXXXXX内容。

i\ 表示在關鍵詞的上一行追加一行内容:

sed學習筆記

修改某行内容可以使用/c指令:

sed學習筆記

注意:以上我們所做的所有操作都是在模式空間裡面做的(記憶體裡面操作),并沒有改變源檔案的内容。

如果要改變源檔案,隻要對sed指令加上-i選項就可以了。

sed學習筆記

3、sed其他常見指令

“=”代表顯示比對到行的行号

sed學習筆記

n: 讀取下一行。前面講到:Sed會把一行内容讀取到模式空間,然後用後面的指令來操作,操作完成之後,會把模式空間裡面的内容顯示在螢幕上,然後把模式空間裡面的内容删除,同時把下一行内容讀取到模式空間。

但有時候,我們需要比對一行之後,然後對比對行的下一行來進行操作:

sed學習筆記

如上圖所示,首先比對到開頭是zz的這一行,比對之後sed會把目前模式空間裡面的内容(zz開頭的那行)删除,然後讀取下一行内容,然後利用n後面的指令對目前模式空間内容操作,即把tom替換為TOM。

sed學習筆記

以上指令是把所有的rhce全部換成RHCE。但是我們看到第一行的最後有rh,第二行的開頭有ce,因為這個rhce被分成了兩行,是以剛才的那個指令就沒有把這個分開rhce換成RHCE。如果我們現在想把這分成兩行的rhce也換成RHCE的話,就需要使用N,N的意思是多行模式空間。意思就說,當sed讀取第一行的時候,遇到了N,然後就會把下一行的内容讀取到模式空間,而原來模式空間裡面的内容是不删除的,隻是把新的一行内容附加到模式空間。

sed學習筆記

上面的指令隻是替換行末的rh和第二行的ce,變為RHCE。

其他的rhce是沒有改變的。

我們可以這樣完成,如下圖所示:

sed學習筆記

如果我們使用多行模式空間的話,^就不表示行的開頭,而是模式空間的開頭,$就不表示行尾,而是模式空間的結束。

sed學習筆記

檔案aaa内容如上圖:

sed學習筆記

如上圖所示,替換僅僅是模式空間裡的開頭的rhce,而并不是每行的開頭。下圖所示,是每行的開頭:

sed學習筆記

$表示模式空間的結尾,而不是檔案中每行的結尾。如下圖所示:

sed學習筆記

除了模式空間之外,還有保持空間,我們可以了解是一個緩存。

當我們對模式空間裡面的内容操作的時候,如果相對模式空間裡面的内容儲存一個副本的話,那麼我們可以把模式空間裡面的内容存儲在保持空間裡面。保持空間的内容和模式空間的内容是可以互換的。使用指令式h(H)、g(G),h(H)是把模式空間的内容存儲到保持空間,g(G)的意思是把保持空間的内容存儲在模式空間裡面。

檔案bbb内容如下圖:

sed學習筆記

現在想把檔案bbb裡面的内容變成如下格式:

b

a

bb

aa

我們可以這麼完成:

sed學習筆記

上面就是一些常見的指令。

當我們在學習其他語言的時候,經常會遇到循環,我可以讓滿足某些條件的内容重新執行某些指令,比如我們可以是while循環等等,但是在sed裡面沒有這些。如果我們也想執行一些循環的話,可以借助标簽來完成:

文法:sed  ‘:label; 指令1;指令2;…;/模式/b label’  file