Ubuntu小技巧14--sed命令詳解

1 sed 簡介

Sed是一個簡化的非交互式編輯器,它是linux下三大文本處理工具之一(另外兩個爲grep awk)。 它允許你執行可在vi和ex編輯器使用的相同類型的編輯任務。 sed程序並不是與編輯器交互工作,而是在命令行鍵入編輯命令、命名文件,然後在屏幕上查看編輯命令的輸出。 sed編輯器是非破壞性的,除非使用shell重定向保存輸出,否則它不會更改執行操作的文件。 默認情況下,所有行都打印在屏幕上。

工作模式:
sed編輯器一次處理一行文件(或輸入)並將其輸出發送到屏幕。 它的相關命令我們可以從vi和ed/ex編輯器看到一些類似的用法。 Sed將當前正在處理的行存儲在稱爲模式空間或臨時緩衝區的臨時緩衝區中,一旦sed完成對模式空間中行的處理(即,在該行上執行sed命令),模式空間中的行就會被輸出到屏幕(除非命令是刪除行或禁止其打印)。 處理完行後,將其從模式空間中刪除,然後將下一行讀入模式空間中進行處理並顯示。 當處理完輸入文件的最後一行時,Sed就結束了。 Sed通過將每一行存儲在臨時緩衝區中並在該行上執行編輯,該方法使得原始文件永遠不會被更改或銷燬。其原理如下圖所示:
sed工作原理
使用格式:sed [OPTION]… {script-only-if-no-other-script} [input-file]…

與grep一樣,Sed可以使用正則表達式來完成文本處理,正則表達式是用正斜槓包含的字符模式,主要用於搜索和替換。
方法:sed -n ‘/RE/p’ filename
示例1.1:sed -n ‘/love/p’ datafile
說明:輸出包含love的行,注意此處p表示輸出,不可缺少

方法:sed -n ‘s/RE/replacement string/p’ filename
示例1.2:sed -n ‘s/love/like/p’ datafile
說明:將包含love的行替換爲like,注意此處的s不可少,缺少p後無輸出

2 正則表達式通配符

以下爲sed中常用正則的標誌和功能,以及案例說明:

Metacharacter Function Example What It Matches
^ 起始行 /^love/ 匹配所有以love開頭的行
$ 結尾行 /love$/ 匹配所有以love結尾的行
. 匹配一個字符,單不是換行符 /l…e/ 匹配包括Ixxe的所有行,xx爲任意兩個字符
* 匹配0或者多個字符 / *love/ 匹配包含0或者多個字符的行,且結尾爲love,注意: *love 中 *前面有個空格
[ ] 匹配一個在集合中的字符 /[Ll]ove/ 匹配到包括Love或者love的行
[^ ] 匹配一個字符不在集合中 /[^A–KM–Z]ove/ 匹配不包括A-K和MZ切接着爲ove的行
(…) 保存匹配到的字符 s/(love)able/\1er/ 標記部分內容到tag1中(最多有9個tag),以便於後續使用,例如此處將love標記爲tag1,後續可以通過\1來表示love;將loveable替換爲lover,其中\1即爲love
& 保存搜索的字符串,以便於在替換的時候使用 s/love/**&**/ 保存love, 將 love 替換爲 **love**.
< 匹配以某個單詞開頭 /<love/ 匹配到包含 一個單詞以love開頭的行
> 匹配以某個單詞結尾 /love>/ 匹配到包含 一個單詞以love結尾的行
x{m}
x{m,}
x{m,n}
連續重複字符x m次
連續重複字符x 至少m次
連續重複字符x m-n次
/o{5}/
/o{5,}/
/o{5,10}/
匹配到 連續出現5次o的行
匹配到 連續出現至少5次o的行
匹配到 連續出現5-10次o的行

3 命令選項

3.1 命令

Command Function
a\ 追加1或者多行文本到當前行
c\ 使用新的文本內容替換當前行
d 刪除行
i\ 在當前行之前插入文本
h 將模式空間的內容複製到緩存空間
H 將模式空間的內容追加到緩存空間
g 獲取緩存空間的內容,並將其複製到模式空間(覆蓋模式空間的內容)
G 獲取緩存空間的內容,並將其複製到模式空間(追加到模式空間)
l 列出非打印字符
p 按行輸出
n 讀取下一行,並且用n對應命令處理新行內容(而不是用老方法處理新行內容)
q 退出sed命令
r 從文件讀出多行數據
! 除選擇的內容外,應用該命令到所有的行
s 替換字符串
Substitution Flags
g 在行上進行全局替換(默認替換隻進行一行,加了g後可以對所有行進行替換)
p 輸出選中行對應的數據
w 將匹配的行寫到指定文件中
x 交換緩存空間和模式空間中的內容
y 轉換一個字符爲另外一個字符,例如 y/ab/AB 將a轉爲A,b轉爲B(cannot use regular expression metacharacters with y)

示例3.1.1 :sed ‘2,5d’ myfile
說明:刪除2-5行數據,即輸出不包含2-5行的所有數據

3.2 選項

Options Function
–e 增加一個可執行的腳本
–f 將腳本的內容添加到要執行的命令
–n 禁止默認輸出

-n 和p結合可以輸出;單獨-n無p就沒有輸出;
示例3.2.1:sed -n -f f.txt datafile
其中,f.txt 內容爲 /dog$/p,其等價爲sed -n ‘/dog$/p’ datafile
說明:輸出以dog結尾的行。

3.3 舉例

datafile內容:

northwest   NW  Charles Main        3.0 .98 3   34
western     WE  Sharon  Gray        5.3 .97 5   23  
southwest   SW  Lewis   Dalsass     2.7 .8  2   18
southern    SO  Suan    Chin        5.1 .95 4   15
southeast   SE  Patricia Hemenway   4.0 .7  4   17
eastern     EA  TB      Savage      4.4 .84 5   20  
northeast   NE  AM      Main Jr.    5.1 .94 3   13
north       NO  Margot  Weber       4.5 .89 5   9
central     CT  Ann     Stephens    5.7 .94 5   13

示例3.3.1: sed ‘/north/p’ datafile
說明:逐行輸出所有內容,包含該north的會重複輸出
結果:

northwest   NW  Charles Main        3.0 .98 3   34
northwest   NW  Charles Main        3.0 .98 3   34
western     WE  Sharon  Gray        5.3 .97 5   23  
southwest   SW  Lewis   Dalsass     2.7 .8  2   18
southern    SO  Suan    Chin        5.1 .95 4   15
southeast   SE  Patricia Hemenway   4.0 .7  4   17
eastern     EA  TB      Savage      4.4 .84 5   20  
northeast   NE  AM      Main Jr.    5.1 .94 3   13
northeast   NE  AM      Main Jr.    5.1 .94 3   13
north       NO  Margot  Weber       4.5 .89 5   9
north       NO  Margot  Weber       4.5 .89 5   9
central     CT  Ann     Stephens    5.7 .94 5   13

示例3.3.2: sed -n ‘/north/p’ datafile
說明:只輸出包含該north的行
結果:

northwest   NW  Charles Main        3.0 .98 3   34
northeast   NE  AM      Main Jr.    5.1 .94 3   13
north       NO  Margot  Weber       4.5 .89 5   9

示例3.3.3: sed ‘3d’ datafile
說明: 刪除第3行
示例3.3.4: sed ‘3,$d’ datafile
說明:從第3行開始全部刪除
結果:

northwest   NW  Charles Main        3.0 .98 3   34
western     WE  Sharon  Gray        5.3 .97 5   23

示例3.3.5: sed ‘$d’ datafile
說明: 刪除最後一行
示例3.3.6: sed ‘/[WSN]E/d’ datafile
說明: 刪除匹配到WE|SE|NE的行
結果:

northwest   NW  Charles Main        3.0 .98 3   34
southwest   SW  Lewis   Dalsass     2.7 .8  2   18
southern    SO  Suan    Chin        5.1 .95 4   15
eastern     EA  TB      Savage      4.4 .84 5   20  
north       NO  Margot  Weber       4.5 .89 5   9
central     CT  Ann     Stephens    5.7 .94 5   13

示例3.3.7: sed -n ‘s/^west/north/p’ datafile
說明:匹配到west開頭的行,並將west替換爲north,然後輸出
結果:

northern     WE  Sharon  Gray        5.3 .97 5   23

示例3.3.8: sed ‘s/[0-9][5-9]$/&.5/’ datafile
說明:匹配最後兩個爲數組,切最後一個在5-9之間的,在這樣的行後追加 .5
結果:

northwest   NW  Charles Main        3.0 .98 3   34
western     WE  Sharon  Gray        5.3 .97 5   23  
southwest   SW  Lewis   Dalsass     2.7 .8  2   18.5
southern    SO  Suan    Chin        5.1 .95 4   15.5
southeast   SE  Patricia Hemenway   4.0 .7  4   17.5
eastern     EA  TB      Savage      4.4 .84 5   20  
northeast   NE  AM      Main Jr.    5.1 .94 3   13
north       NO  Margot  Weber       4.5 .89 5   9
central     CT  Ann     Stephens    5.7 .94 5   13

示例3.3.9: sed ‘s/3/88/g’ datafile 等價 sed ‘s#3#88#g’ datafile
說明: 將所有的3替換爲88
示例:3.3.10: sed ‘s/3/88/’ datafile 等價 sed ‘s#3#88#’ datafile
說明: 將最後一個3替換爲88
示例3.3.11: sed -n ‘5,/^eastern/p’ datafile
說明: 從第5行開始輸出,知道出現的第一個eastern的那一行爲止,若一直沒有easter則從第5行開始全部輸出
結果:

southeast   SE  Patricia Hemenway   4.0 .7  4   17
eastern     EA  TB      Savage      4.4 .84 5   20 

示例3.3.12: sed -e ‘1,7d’ -e ‘s/Ann/Bnn/’ datafile
說明: 刪除1-7行,然後將Ann替換爲Bnn,-e表示可以使用多次規則
結果:

north       NO  Margot  Weber       4.5 .89 5   9
central     CT  Bnn     Stephens    5.7 .94 5   13

示例3.3.13: sed ‘/Suan/r newfile’ datafile
說明:讀出newfile中的內容,匹配到Suan後將其追加到Suan所在的行後面
示例3.3.14: sed -n ‘/north/w newfile’ datafile
說明: 將匹配到north的行全部輸出到newfile中
示例3.3.15: sed '/^north /a\ This is function of a\ ’ datafile
說明: 匹配到north 開頭的行,並追加This is function of a
結果:

northwest   NW  Charles Main        3.0 .98 3   34
western     WE  Sharon  Gray        5.3 .97 5   23  
southwest   SW  Lewis   Dalsass     2.7 .8  2   18
southern    SO  Suan    Chin        5.1 .95 4   15
southeast   SE  Patricia Hemenway   4.0 .7  4   17
eastern     EA  TB      Savage      4.4 .84 5   20  
northeast   NE  AM      Main Jr.    5.1 .94 3   13
north       NO  Margot  Weber       4.5 .89 5   9
 This is function of a\ 
central     CT  Ann     Stephens    5.7 .94 5   13

示例3.3.16: sed ‘1,3y/abcdef/ABCDEF/’ datafile
說明: 將 1-3行的abcdef 由小寫替換爲大寫
示例3.3.17: sed ‘/eastern/{ n; s/AM/Archie/; }’ datafile
說明:匹配到eastern後立馬處理下一行, 下一行的處理方法爲: 將Archie替換爲AM
結果:

northwest   NW  Charles Main        3.0 .98 3   34
western     WE  Sharon  Gray        5.3 .97 5   23  
southwest   SW  Lewis   Dalsass     2.7 .8  2   18
southern    SO  Suan    Chin        5.1 .95 4   15
southeast   SE  Patricia Hemenway   4.0 .7  4   17
eastern     EA  TB      Savage      4.4 .84 5   20  
northeast   NE  Archie      Main Jr.    5.1 .94 3   13
north       NO  Margot  Weber       4.5 .89 5   9
central     CT  Ann     Stephens    5.7 .94 5   13

待添加…

4 使用案例及注意事項

4.1 使用案例

後續將在此處逐漸補充一些常用的案例。

4.2 注意事項

  1. 通過\c正則內容c 的方式
    方法:sed -n ‘\cREcp’ filename
    說明:其中\c c即爲正則表達的起始標誌,等價於/ /
    示例4.2.1:sed -n ‘\cdog$cp’ datafile 和 sed -n ‘/dog$/p’ datafile
    說明:\c c 和\ \等價,都是輸出以dog結尾的行。

  2. sed ‘s/dog/123/’ datafile 、 sed ‘s/dog/123/p’ datafile 和 sed -n ‘s/dog/123/p’ datafile 的區別
    第一個不會重複全輸出,
    第二個全部輸出,但是包含dog的行會重複,
    最後一個不重複且只輸出包含dog的行;

5 說明

測試系統版本:Ubuntu 1910 SERVER (64-bit)
參考文獻: UNIX® Shells by Example Fourth Edition By Ellie Quigley

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