一、sed介紹
sed 是一種新型的,非互動式的編輯器。它能執行與編輯器 vi 和 ex 相同的編輯任務。sed 編輯器沒有提供互動式使用方式,使用者隻能在指令行輸入編輯指令、指定檔案名,然後在螢幕上檢視輸出。 sed 編輯器沒有破壞性,它不會修改檔案,除非使用 shell 重定向來儲存輸出結果。預設情況下,所有的輸出行都被列印到螢幕上。
sed 編輯器逐行處理檔案(或輸入),并将輸出結果發送到螢幕。 sed 的指令就是在 vi和 ed/ex 編輯器中見到的那些。 sed 把目前正在處理的行儲存在一個臨時緩存區中,這個緩存區稱為模式空間或臨時緩沖。sed 處理完模式空間中的行後(即在該行上執行 sed 指令後),就把改行發送到螢幕上(除非之前有指令删除這一行或取消列印操作)。 sed 每處理完輸入檔案的最後一行後, sed 便結束運作。 sed 把每一行都存在臨時緩存區中,對這個副本進行編輯,是以不會修改或破壞源檔案。如圖 1: sed 處理過程。

二、sed指令使用示例
為了示範sed指令,臨時建立test.txt檔案,内容如下。
(base) [[email protected] ~]# ll /usr/ > test.txt
(base) [[email protected] ~]# cat test.txt
total 272
dr-xr-xr-x. 2 root root 49152 Jan 17 05:09 bin
drwxr-xr-x. 2 root root 6 Apr 10 2018 etc
drwxr-xr-x. 2 root root 6 Apr 10 2018 games
drwxr-xr-x. 40 root root 8192 Dec 15 22:02 include
dr-xr-xr-x. 43 root root 4096 Dec 15 22:03 lib
dr-xr-xr-x. 143 root root 81920 Jan 16 06:56 lib64
drwxr-xr-x. 49 root root 12288 Dec 15 22:03 libexec
drwxr-xr-x. 12 root root 131 Dec 15 21:59 local
dr-xr-xr-x. 2 root root 20480 Jan 16 06:56 sbin
drwxr-xr-x. 235 root root 8192 Jan 16 06:56 share
drwxr-xr-x. 4 root root 34 Dec 15 21:59 src
lrwxrwxrwx. 1 root root 10 Dec 15 21:59 tmp -> …/var/tmp
1、列印比對的行
(base) [[email protected] ~]# sed -n ‘/lib/p’ test.txt
dr-xr-xr-x. 43 root root 4096 Dec 15 22:03 lib
dr-xr-xr-x. 143 root root 81920 Jan 16 06:56 lib64
drwxr-xr-x. 49 root root 12288 Dec 15 22:03 libexec
2、替換指定的行
(base) [[email protected] ~]# sed ‘s/include/test2/g’ test.txt
total 272
dr-xr-xr-x. 2 root root 49152 Jan 17 05:09 bin
drwxr-xr-x. 2 root root 6 Apr 10 2018 etc
drwxr-xr-x. 2 root root 6 Apr 10 2018 games
drwxr-xr-x. 40 root root 8192 Dec 15 22:02 test2
dr-xr-xr-x. 43 root root 4096 Dec 15 22:03 lib
dr-xr-xr-x. 143 root root 81920 Jan 16 06:56 lib64
drwxr-xr-x. 49 root root 12288 Dec 15 22:03 libexec
drwxr-xr-x. 12 root root 131 Dec 15 21:59 local
dr-xr-xr-x. 2 root root 20480 Jan 16 06:56 sbin
drwxr-xr-x. 235 root root 8192 Jan 16 06:56 share
drwxr-xr-x. 4 root root 34 Dec 15 21:59 src
lrwxrwxrwx. 1 root root 10 Dec 15 21:59 tmp -> …/var/tmp
3、删除指定行
删除的行号含,例如‘10,13d’删除了第10号至第13行。
(base) [[email protected] ~]# sed ‘10,13d’ test.txt
total 272
dr-xr-xr-x. 2 root root 49152 Jan 17 05:09 bin
drwxr-xr-x. 2 root root 6 Apr 10 2018 etc
drwxr-xr-x. 2 root root 6 Apr 10 2018 games
drwxr-xr-x. 40 root root 8192 Dec 15 22:02 include
dr-xr-xr-x. 43 root root 4096 Dec 15 22:03 lib
dr-xr-xr-x. 143 root root 81920 Jan 16 06:56 lib64
drwxr-xr-x. 49 root root 12288 Dec 15 22:03 libexec
drwxr-xr-x. 12 root root 131 Dec 15 21:59 local
(base) [[email protected] ~]# sed ‘5,$d’ test.txt
total 272
dr-xr-xr-x. 2 root root 49152 Jan 17 05:09 bin
drwxr-xr-x. 2 root root 6 Apr 10 2018 etc
drwxr-xr-x. 2 root root 6 Apr 10 2018 games
4、比對字元串的行行尾添加指定内容
(base) [[email protected] ~]# sed ‘/^dr-/ s/$/可讀目錄/’ test.txt
total 272
dr-xr-xr-x. 2 root root 49152 Jan 17 05:09 bin可讀目錄
drwxr-xr-x. 2 root root 6 Apr 10 2018 etc
drwxr-xr-x. 2 root root 6 Apr 10 2018 games
drwxr-xr-x. 40 root root 8192 Dec 15 22:02 include
dr-xr-xr-x. 43 root root 4096 Dec 15 22:03 lib可讀目錄
dr-xr-xr-x. 143 root root 81920 Jan 16 06:56 lib64可讀目錄
drwxr-xr-x. 49 root root 12288 Dec 15 22:03 libexec
drwxr-xr-x. 12 root root 131 Dec 15 21:59 local
dr-xr-xr-x. 2 root root 20480 Jan 16 06:56 sbin可讀目錄
drwxr-xr-x. 235 root root 8192 Jan 16 06:56 share
drwxr-xr-x. 4 root root 34 Dec 15 21:59 src
lrwxrwxrwx. 1 root root 10 Dec 15 21:59 tmp -> …/var/tmp
5、比對字元串的位置後添加指定内容
(base) [[email protected] ~]# sed ‘s/^dr-/&可讀目錄/’ test.txt
total 272
dr-可讀目錄xr-xr-x. 2 root root 49152 Jan 17 05:09 bin
drwxr-xr-x. 2 root root 6 Apr 10 2018 etc
drwxr-xr-x. 2 root root 6 Apr 10 2018 games
drwxr-xr-x. 40 root root 8192 Dec 15 22:02 include
dr-可讀目錄xr-xr-x. 43 root root 4096 Dec 15 22:03 lib
dr-可讀目錄xr-xr-x. 143 root root 81920 Jan 16 06:56 lib64
drwxr-xr-x. 49 root root 12288 Dec 15 22:03 libexec
drwxr-xr-x. 12 root root 131 Dec 15 21:59 local
dr-可讀目錄xr-xr-x. 2 root root 20480 Jan 16 06:56 sbin
drwxr-xr-x. 235 root root 8192 Jan 16 06:56 share
drwxr-xr-x. 4 root root 34 Dec 15 21:59 src
lrwxrwxrwx. 1 root root 10 Dec 15 21:59 tmp -> …/var/tmp
6、列印指定行開始開始比對字元串的之間的行
(base) [[email protected] ~]# sed -n ‘5,/drwxr/p’ test.txt![]()
Linux指令之sed指令詳解一、sed介紹二、sed指令使用示例三、sed指令參數詳解
7、多重編輯
(base) [[email protected] ~]# sed -e ‘1,5d’ -e ‘s/sbin/stestttttttt/g’ test.txt
dr-xr-xr-x. 43 root root 4096 Dec 15 22:03 lib
dr-xr-xr-x. 143 root root 81920 Jan 16 06:56 lib64
drwxr-xr-x. 49 root root 12288 Dec 15 22:03 libexec
drwxr-xr-x. 12 root root 131 Dec 15 21:59 local
dr-xr-xr-x. 2 root root 20480 Jan 16 06:56 stestttttttt
drwxr-xr-x. 235 root root 8192 Jan 16 06:56 share
drwxr-xr-x. 4 root root 34 Dec 15 21:59 src
lrwxrwxrwx. 1 root root 10 Dec 15 21:59 tmp -> …/var/tmp
8、内容追加
(base) [[email protected] ~]# sed ‘/^lrw/a this is add something!’ test.txt
total 272
dr-xr-xr-x. 2 root root 49152 Jan 17 05:09 bin
drwxr-xr-x. 2 root root 6 Apr 10 2018 etc
drwxr-xr-x. 2 root root 6 Apr 10 2018 games
drwxr-xr-x. 40 root root 8192 Dec 15 22:02 include
dr-xr-xr-x. 43 root root 4096 Dec 15 22:03 lib
dr-xr-xr-x. 143 root root 81920 Jan 16 06:56 lib64
drwxr-xr-x. 49 root root 12288 Dec 15 22:03 libexec
drwxr-xr-x. 12 root root 131 Dec 15 21:59 local
dr-xr-xr-x. 2 root root 20480 Jan 16 06:56 sbin
drwxr-xr-x. 235 root root 8192 Jan 16 06:56 share
drwxr-xr-x. 4 root root 34 Dec 15 21:59 src
lrwxrwxrwx. 1 root root 10 Dec 15 21:59 tmp -> …/var/tmp
this is add something!
9、直接修改目前文檔
使用-i參數直接更新目前文檔。
(base) [[email protected] ~]# sed -i ‘s/lib/libbbbbbbb/g’ test.txt
(base) [[email protected] ~]# cat test.txt
total 272
dr-xr-xr-x. 2 root root 49152 Jan 17 05:09 bin
drwxr-xr-x. 2 root root 6 Apr 10 2018 etc
drwxr-xr-x. 2 root root 6 Apr 10 2018 games
drwxr-xr-x. 40 root root 8192 Dec 15 22:02 include
dr-xr-xr-x. 43 root root 4096 Dec 15 22:03 libbbbbbbb
dr-xr-xr-x. 143 root root 81920 Jan 16 06:56 libbbbbbbb64
drwxr-xr-x. 49 root root 12288 Dec 15 22:03 libbbbbbbbexec
drwxr-xr-x. 12 root root 131 Dec 15 21:59 local
dr-xr-xr-x. 2 root root 20480 Jan 16 06:56 sbin
drwxr-xr-x. 235 root root 8192 Jan 16 06:56 share
drwxr-xr-x. 4 root root 34 Dec 15 21:59 src
lrwxrwxrwx. 1 root root 10 Dec 15 21:59 tmp -> …/var/tmp
10、直接修改比對行為指定内容
(base) [[email protected] ~]# sed ‘/src$/c this is src’ test.txt
total 272
dr-xr-xr-x. 2 root root 49152 Jan 17 05:09 bin
drwxr-xr-x. 2 root root 6 Apr 10 2018 etc
drwxr-xr-x. 2 root root 6 Apr 10 2018 games
drwxr-xr-x. 40 root root 8192 Dec 15 22:02 include
dr-xr-xr-x. 43 root root 4096 Dec 15 22:03 libbbbbbbb
dr-xr-xr-x. 143 root root 81920 Jan 16 06:56 libbbbbbbb64
drwxr-xr-x. 49 root root 12288 Dec 15 22:03 libbbbbbbbexec
drwxr-xr-x. 12 root root 131 Dec 15 21:59 local
dr-xr-xr-x. 2 root root 20480 Jan 16 06:56 sbin
drwxr-xr-x. 235 root root 8192 Jan 16 06:56 share
this is src
lrwxrwxrwx. 1 root root 10 Dec 15 21:59 tmp -> …/var/tmp
11、字元轉換
字元按照一對一的方式從左到右進行轉換。例如 y/abc/ABC/,會把小寫字母轉換成大寫字母, a–>A,b–>B,c–>C。
(base) [[email protected] ~]# sed ‘1,13y/drwx/DRWX/’ test.txt
total 272
DR-XR-XR-X. 2 Root Root 49152 Jan 17 05:09 bin
DRWXR-XR-X. 2 Root Root 6 ApR 10 2018 etc
DRWXR-XR-X. 2 Root Root 6 ApR 10 2018 games
DRWXR-XR-X. 40 Root Root 8192 Dec 15 22:02 incluDe
DR-XR-XR-X. 43 Root Root 4096 Dec 15 22:03 libbbbbbbb
DR-XR-XR-X. 143 Root Root 81920 Jan 16 06:56 libbbbbbbb64
DRWXR-XR-X. 49 Root Root 12288 Dec 15 22:03 libbbbbbbbeXec
DRWXR-XR-X. 12 Root Root 131 Dec 15 21:59 local
DR-XR-XR-X. 2 Root Root 20480 Jan 16 06:56 sbin
DRWXR-XR-X. 235 Root Root 8192 Jan 16 06:56 shaRe
DRWXR-XR-X. 4 Root Root 34 Dec 15 21:59 sRc
lRWXRWXRWX. 1 Root Root 10 Dec 15 21:59 tmp -> …/vaR/tmp
三、sed指令參數詳解
1、sed 指令的基本格式
#sed [選項] [腳本指令] 檔案名
(base) [[email protected] ~]# sed --help
Usage: sed [OPTION]… {script-only-if-no-other-script} [input-file]…
2、參數說明
- -e<script>或–expression=<script> 以選項中指定的script來處理輸入的文本檔案。
- -f<script檔案>或–file=<script檔案> 以選項中指定的script檔案來處理輸入的文本檔案。
- -h或–help 顯示幫助。
- -n或–quiet或–silent 僅顯示script處理後的結果。
- -V或–version 顯示版本資訊。
3、動作說明
- a :新增, a 的後面可以接字串,而這些字串會在新的一行出現(目前的下一行)~
- c :取代, c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行!
- d :删除,因為是删除啊,是以 d 後面通常不接任何咚咚;
- i :插入, i 的後面可以接字串,而這些字串會在新的一行出現(目前的上一行);
- p :列印,亦即将某個選擇的資料印出。通常 p 會與參數 sed -n 一起運作~
- s :取代,可以直接進行取代的工作哩!通常這個 s 的動作可以搭配正規表示法!例如 1,20s/old/new/g 就是啦!
4、sed常用指令
- a\ 在目前行下面插入文本;
- i\ 在目前行上面插入文本;
- c\ 把標明的行改為新的文本;
- d 删除,删除選擇的行;
- D 删除模闆塊的第一行;
- s 替換指定字元;
- h 拷貝模闆塊的内容到記憶體中的緩沖區;
- H 追加模闆塊的内容到記憶體中的緩沖區;
- g 獲得記憶體緩沖區的内容,并替代目前模闆塊中的文本;
- G 獲得記憶體緩沖區的内容,并追加到目前模闆塊文本的後面;
- l 清單不能列印字元的清單;
- n 讀取下一個輸入行,用下一個指令處理新的行而不是用第一個指令;
- N 追加下一個輸入行到模闆塊後面并在二者間嵌入一個新行,改變目前行号碼;
- p 列印模闆塊的行。 P(大寫) 列印模闆塊的第一行;
-
q 退出Sed;
b lable 分支到腳本中帶有标記的地方,如果分支不存在則分支到腳本的末尾;
- r file 從file中讀行;
- t label if分支,從最後一行開始,條件一旦滿足或者T,t指令,将導緻分支到帶有标号的指令處,或者到腳本的末尾;
- T label 錯誤分支,從最後一行開始,一旦發生錯誤或者T,t指令,将導緻分支到帶有标号的指令處,或者到腳本的末尾;
- w file 寫并追加模闆塊到file末尾;
- W file 寫并追加模闆塊的第一行到file末尾;
- ! 表示後面的指令對所有沒有被標明的行發生作用;
- = 列印目前行号;
- # 把注釋擴充到下一個換行符以前;
5、sed替換标記
- g 表示行内全面替換;
- p 表示列印行;
- w 表示把行寫入一個檔案;
- x 表示互換模闆塊中的文本和緩沖區中的文本;
- y 表示把一個字元翻譯為另外的字元(但是不用于正規表達式);
- \1 子串比對标記;
- & 已比對字元串标記;
6、sed元字元集
- ^ 比對行開始,如:/^sed/比對所有以sed開頭的行;
- $ 比對行結束,如:/sed$/比對所有以sed結尾的行;
- . 比對一個非換行符的任意字元,如:/s.d/比對s後接一個任意字元,最後是d;
- \ * 比對0個或多個字元,如:/*sed/比對所有模闆是一個或多個空格後緊跟sed的行;
- \ [] 比對一個指定範圍内的字元,如/[ss]ed/比對sed和Sed;
- [^] 比對一個不在指定範圍内的字元,如:/[^A-RT-Z]ed/比對不包含A-R和T-Z的一個字母開頭,緊跟ed的行;
- \(…\) 比對子串,儲存比對的字元,如s/(love)able/\1rs,loveable被替換成lovers;
- & 儲存搜尋字元用來替換其他字元,如s/love/&/,love這成love;
- \< 比對單詞的開始,如:/\
- \> 比對單詞的結束,如/love>/比對包含以love結尾的單詞的行;
- x\{m\} 重複字元x,m次,如:/0{5}/比對包含5個0的行;
- x\{m,\} 重複字元x,至少m次,如:/0{5,}/比對至少有5個0的行;
- x\{m,n\} 重複字元x,至少m次,不多于n次,如:/0{5,10}/比對5~10個0的行;