sed

 sed命令基本用法正則表達式

sed是一個非交互式文本編輯器,它能夠對文本文件和標準輸入進行編輯,標準輸入能夠是來自鍵盤輸入、文件重定向、字符串、變量、來自管道的文本等等。shell

sed從文本的一個文本行或標準輸入中讀取數據,將其複製到緩存區,而後讀取命令行或腳本的第一個命令,對此命令要求的行號進行編輯,重複此過程,直到命令行或腳本中全部命令都執行完了。sed能夠一次性處理全部的編輯命令,很是高效緩存

 

sed適用於下面三種場合:app

* 編輯相對於交互式文本編輯器而言太大的場合編輯器

* 編輯命令太複雜,在交互式文本編輯器中難以輸入的狀況函數

* 對文件掃描一遍,可是須要執行多個編輯函數的狀況this

 

sed只是對緩存區中原始文件的副本進行編輯,並不編輯原始文件。所以,若是須要保存更改內容,須要將輸出重定向到另外一個文件,可使用下面的命令:spa

sed 'sed命令' input_file > result_file命令行

或者還有另外一種方法就是 -w 選項,這個後面講到code

 

有三種方式調用sed:

① 直接在shell命令行上調用

# sed [選項] 'sed命令' 輸入文件

② 將sed命令插入腳本文件後,經過sed命令調用腳本:

# sed [選項] -f sed腳本文件名 輸入文件

③ 將sed命令寫入腳本文件後,將其+x變成可執行

./sed腳本文件 輸入文件

第三種方式須要在文件頭部加上 #!/bin/sed

 

sed命令的經常使用選項:

-n    不打印全部行到標準輸出

-e    表示將下一個字符串解析爲sed編輯命令,若是隻傳遞一個編輯命令,-e能夠省略

-f     表示正在調用sed腳本文件

 

sed命令一般由定位文本行和sed編輯命令兩部分組成,sed編輯命令對定位到的行進行各類編輯處理

sed提供兩種方式定位文本行:

* 使用行號,指定一行或者行號範圍

* 使用正則表達式

 

sed命令定位文本行的方法:

選項 意義
x x爲指定行號
x,y 指定從x到y的行號範圍
/pattern/ 查詢包含模式的行
/pattern/pattern/ 查詢包含兩個模式的行
/pattern/,x 從與pattern的匹配行到x號行之間的行
x,/pattern/ 從x號行到與pattern的匹配行之間的行
x,y! 查詢不包含x和y行號的行

 

===================================分割線=======================

sed編輯命令表

選項 意義
p 打印匹配行
= 打印匹配行號
a\ 在定位行以後追加文本信息
i\ 在定位行以前插入文本信息
d 刪除定位行
c\ 用新文本替換定位行
s 使用替換模式替換相應的模式
r 從另外一個文件中讀文本
w 將文本寫入到另外一個文件中
y 變換字符
q 第一個模式匹配完成後退出
l 顯示與八進制ASCII碼等價的控制字符
{} 在定位行執行的命令組
n 讀取下一個輸入行,用下一個命令處理新的行
h 將模式緩存區的文本複製到保持緩存區
H 將模式緩存區的文本追加到保持緩存區
x 互換模式緩存區和保持緩存區的內容
g 將保持緩存區的內容複製到模式緩存區
G 將保持緩存區的內容追加到模式緩存區

 

========================分割線============================

各個選項和編輯命令詳解:

1,sed命令的-n選項和p命令

# sed -n '1p' input

# sed '1p' input

從輸出能夠看出,加了-n後標準輸出上只有第一行打印出來了,而不加-n時候,先打印第一行,而後打印整個文件內容。因此-n選項的意義是:不打印sed編輯內容也就是input的所有內容。只打印匹配的行

# sed -n '3,6p' input   --> 打印從3到6行

# sed -n '/certificate/p' input  --> 打印匹配模式行,注意大小寫是敏感的

 

2,sed命令的-e選項

因爲sed不支持同時帶多個編輯命令的用法,所以須要用-e選項指定每一個編輯命令

# sed -n -e '/Certificate/p' -e '/Certificate/=' input

 

3,sed命令的-f選項

-f選項只有調用sed腳本文件時才起做用,追加文本、插入文本、修改文本、刪除文本和替換文本等功能每每須要幾條sed命令才能完成,因此,每每將這些命令寫入sed腳本,而後調用sed腳原本完成。

下面是這個sed的腳本:

Sed代碼   收藏代碼
  1. #!/bin/sed -f  
  2. /file:/a\  
  3. We append a new line.\  
  4. We append another line.  

注:上面的/file:/a\中的\表示在換新行後添加內容,而下面內容中的\也表示換行。

 

4.2.2 sed文本定位的一組例子

1. 匹配元字符

若是目標字符串中包含元字符,須要使用轉義符\屏蔽其特殊意義。

# sed -n '/\./p' input --> 打印含有.的行

2. 使用元字符進行匹配

sed能夠靈活使用正則表達式的元字符進行匹配,不過注意的是:$在正則表達式中表示行尾,可是在sed命令中卻表示最後一行,而寫在//中間的$就表示行尾了,哈哈。

# sed -n '$p' input --> 打印最後一行

# sed -n '/^$/p' input -> 打印空行

3. !符號

!表示取反,也就是不知足條件的時候就處理

# sed -n '/.*this/!p' input  --> 打印不包含this的行

# sed -n '3,6!p' input --> 打印不在3至6行間的行

 

4.2.3 sed基本編輯命令的一組例子

1. 插入文本

插入文本和追加文本相似,區別僅僅是追加文本是在匹配行的後面插入,而插入文本是在匹配行的前面插入

sed插入文本符號位i\,插入文本的格式爲:

sed '指定地址 i\text' 輸入文件

新建名爲insert.sed的腳本,內容以下:

Bash代碼   收藏代碼
  1. #!/bin/sed -f   
  2. # this is comment  
  3. # date : 2013/06/02  
  4. # author : xiongneng  
  5. /this is/i\  
  6. We insert a new line #插入的文本內容  

 

 2. 修改文本

修改文本是指將所匹配的問本行用新文本代替,也就是隻能整行替換,sed修改文本符號位c\

sed '指定行 c\text' 輸入文件

 

3. 刪除文本

sed刪除文本命令能夠將指定行或指定行範圍進行刪除,sed的刪除文本符號爲d

sed '指定行 d' 輸入文件

 

4.替換文本

sed替換文本將所匹配的文本行中找到的字符串用新的字符串去代替,經常使用。而上面的修改文本只能整行,sed替換文本符號爲s

sed -n 's/被替換的字符串/新的字符串/p' --> 只替換每行中第一次找到的

sed -n 's/被替換的字符串/新的字符串/gp' --> 替換每行中全部找到的

sed -n 's/被替換的字符串/新的字符串/np' --> 替換每行中第n次找到的

sed替換文本中有個重要的符號&,它表示保存被替換的字符串以供調用。

好比下面兩條命令等級:(都是將this字符串用括號括起來)

# sed -n 's/this/(&)/gp' input

# sed -n 's/this/(this)/gp' input

 

5. 寫入到一個新文件

上面提到的都是對緩存區中輸入文件的複製內容進行編輯,若是要保存編輯結果,須要將編輯後的文本重定向到另外一個文件,sed寫入文件符號爲w,基本格式爲:

# sed -n '1,5 w output' input

# sed -n '/this/2 output' input

# sed -n 's/this/(&)/gw output' input  --> 將this加上括號後,匹配行寫入到output中去

注:這裏寫到新文件中的只有匹配的行修改後的數據,若是要整個文件內容都寫進去,使用重定向>> 或者>

 

6. 從文件中讀入文本內容

sed命令還能夠將其餘文件中的內容讀入,並附加在指定地址後,sed讀入文件的符號爲r

# sed '/this/r otherfile' input

 

7. 退出命令

sed命令的q選項表示完成指定地址匹配後當即退出

# sed -n '/this/p' input  --> 打印出匹配的所有字符串

# sed -n -e '/this/p' -e '/this/q' test.txt  --> 找到第一個匹配的打印後就當即退出

 

8. 變換命令

sed命令的y選項表示字符變換,它將一系列的字符變換爲相應的字符,逐個處理的

# sed 'y/被變換的字符序列/變換的字符序列/' 輸入文件

# sed 'y/12345/ABCDE' input --> 將input中1變成A,2變成B,3變成C,4變成D,5變成E

 

9. 顯示控制字符

sed 1命令能夠顯示出文件中的控制字符,好比退格鍵、F1鍵、Shift鍵等

# sed -n '1,$1' input

 

10. 在定位行執行命令組

sed編輯命令中的{}能夠指定在定位行上所執行的命令組,它的做用與sed的-e選項相似,都是爲了在定位行執行多個編輯命令。

下面的命令等價:

# sed -n -e '/this/p' -e '/this/q' test.txt 

# sed -n '/this/{p;q}' test.txt -->顯然這個更NB點

 

4.2.4 sed高級編輯命令的一組例子

1. 處理匹配行的下一行

sed編輯命令n的意義是讀取下一個輸入行,用n後面的一個命令處理該行,因爲此時一般有個多個編輯命令,因此命令n須要與{}配合使用

# sed '/this is/{n;s/her/him/;}' input --> 找到this is關鍵詞那行,而後將它下一行的her替換成him

 

2. sed緩存區的處理

前面提到的全部編輯命令都是將輸入文件複製到緩存區,對緩存區的複製內容進行處理。實際上,sed有兩個緩存區,模式緩存區 Pattern Buffer 和保持緩存區 Hold Buffer。前面都是Pattern Buffer,而保持緩存區是另外一個內存空間,sed的一些編輯命令能夠對保持緩存區進行處理,並與模式緩存區的內容互換

# sed h、x、G命令的用法

# sed  '/subject/h; /object/x; $G' input

解釋下:

第一個h命令是將模式緩存區內容複製到保持緩存區,也就是說當找到subject的行的時候,就將該行復制到Hold Buffer,若是該行有object關鍵詞就將模式緩存區和保持緩存內容互換後輸出模式緩存區內容,第三條命令表示若是是到了最後一行,就直接輸出保持緩存區內容。

 

h和H、g和G是兩組對應的命令

h和H命令是將模式緩存區內容替換掉保持緩存區內容,不過h是副本,即將保持緩存區的就內容覆蓋掉,而H是追加,即在保持緩存區內容上增長新的內容

g和G是將保持緩存區內容替換掉模式緩存區內容,一樣,g是副本、G是追加。

 

3.利用分號;分割多個編輯命令,這個比起-e選項更NB一點。^_^

# sed  '/subject/h; /object/x; $G' input

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息