sed 全名為 stream editor,流編輯器,用程式的方式來編輯文字。sed 與vim等編輯器不同,sed 是一種非互動式編輯器(即使用者不必參與編輯過程),它使用預先設定好的編輯指令對輸入的文字進行編輯,完成之後再輸出編輯結構。
sed會一次處理一行內容。處理時,把當前處理的行儲存在臨時緩衝區中,成為"模式空間",接著用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往螢幕。接著處理下一行,這樣不斷重複,直到檔案末尾。檔案內容並沒有改變,除非你使用重定向儲存輸出。
sed [option] ...'script' inputfile... (script是個動作,當單引號為空時,預設輸出)
-n:不輸出模式空間內容到螢幕,即不自動列印
-e:多點編輯
-f: 從指定檔案中讀取編輯指令碼
-i.bak:備份檔案並原處編輯
[root@centos7 ~]# cat 3.ttx
root dcuduuhroot
rootbvnsn23rswt
rqqtjkkkkroot
r12tbcjnnjr13t
r11tmkcmkmkcscsdcvcmkmllkr11t
[root@centos7 ~]# cat 3.ttx | sed -n ' '
[root@centos7 ~]# cat 3.ttx | sed -n '2p'
rootbvnsn23rswt
[root@centos7 ~]# cat 3.ttx | sed -e 's/root/test/g' -e 's/cmkm/kobe/g'
test dcuduuhtest
testbvnsn23rswt
rqqtjkkkktest
r12tbcjnnjr13t
r11tmkkobekcscsdcvkobellkr11t
[root@centos7 ~]#
[root@centos7 ~]# seq 10|sed -n '1~2p'13
579[root@centos7 ~]# seq 10|sed -n '2~2p'24
6810[root@centos7 ~]# seq 10|sed -n '1~2!p'24
6810
a\ 在當前行下面插入文字。
i\ 在當前行上面插入文字。
d 刪除,刪除模式空間匹配的行,並立即啟用下一輪迴圈。
s 替換指定字元
p 列印當前模式空間內容,追加到預設輸出之後。
w 儲存模式匹配的行至指定檔案
r 讀取指定檔案的文字至模式空間中匹配到的行後。
! 表示後面的命令對匹配行取反。
= 列印當前行號碼。
[root@centos7 ~]# seq 3|sed '1ahello'
1hello23
[root@centos7 ~]# seq 3|sed '1ihello'
hello12
3[root@centos7 ~]#
[root@centos7 ~]# seq 3|sed '2d'13
[root@centos7 ~]# seq 3|sed 's/2/nihao/'
1nihao
3[root@centos7 ~]# seq 3|sed '2r/etc/fstab'12
## /etc/fstab
# created by anaconda on tue jul 10 12:01:36 2018
#.......
[root@centos7 ~]#
g 表示行內全面替換。
p 顯示替換成功的行。
w 將替換成功的行儲存至檔案中。
\1 子串匹配標記
& 已匹配字串標記
[root@centos7 ~]# echo 1234567|sed 's/34/&ab/' (匹配詞34之後)
1234ab567
[root@centos7 ~]# echo 1234567|sed 's/67/cd&/' (匹配詞67之前)
12345cd67
^ 匹配行開始,如:/^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\ 重複字元x,m次,如:/0\/匹配包含5個0的行。
x\ 重複字元x,至少m次,如:/0\/匹配至少有5個0的行。
x\ 重複字元x,至少m次,不多於n次,如:/0\/匹配5~10個0的行。
[root@centos7 ~]# cat 3.ttx
root dcuduuhroot
rootbvnsn23rswt
rqqtjkkkkroot
r12tbcjnnjr13t
r11tmkcmkmkcscsdcvcmkmllkr11t
[root@centos7 ~]# cat 3.ttx |sed -r 's/(r..t).*\1/hello/g'
hello
rootbvnsn23rswt
rqqtjkkkkroot
r12tbcjnnjr13t
hello
[root@centos7 ~]#
前面也有提到模式空間,即為處理檔案中一行內容的乙個臨時緩衝區。處理完一行之後就會把模式空間中的內容列印到標準輸出,然後自動清空快取。
而這裡說的保持空間是sed中的另外乙個緩衝區,此緩衝區正如其名,不會自動清空,但也不會主動把此緩衝區中的內容列印到標準輸出中。而是需要以下sed命令進行處理:
保持空間sed在正常情況下,將處理的行讀入模式空間,指令碼中的「sed command(sed命令)」就一條接著一條進行處理,直到指令碼執行完畢。然後該行被輸出,模式被清空;接著,在重複執行剛才的動作,檔案中的新的一行被讀入,直到檔案處理完畢。
模式空間可以比喻為乙個生產線,而保持空間則可以被比喻為倉庫。
h :把模式空間裡的內容複製到暫存緩衝區(保持空間)
h :把模式空間裡的內容追加到暫存緩衝區(保持空間)
g :把暫存緩衝區裡的內容複製到模式空間,覆蓋原有的內容
g:把暫存緩衝區的內容追加到模式空間裡,追加在原有內容的後面
n :讀取下乙個輸入行,用下乙個命令處理新的行而不是用第乙個命令
n :追加下乙個輸入行到模板塊後面並在二者間嵌入乙個新行,改變當前行號碼
具體用法如下:
seq 1 10 |sed 'n;d' 只顯示奇數行
[root@centos7 ~]# seq 10|sed 'n;d'13
579[root@centos7 ~]#
cat seq.txt |sed '/^$/d;g' 空行刪除,每行後加乙個空行,即保證每行後只有乙個空行
[root@centos7 ~]# seq 10|sed '/^$/d;g'12
3456
78910
seq 1 10 |sed 'g' 所有行變為空行
[root@centos7 ~]# seq 10|sed 'g'
[root@centos7 ~]#
seq 1 10 |sed '$!n;$!d' 輸出倒數後兩行
[root@centos7 ~]# seq 10|sed '$!n;$!d'910
[root@centos7 ~]#
seq 1 10 |sed 'n;d' 或 seq 1 10 |sed '$!d' 只輸出最後一行
[root@centos7 ~]# seq 10|sed 'n;d'
10[root@centos7 ~]# seq 10|sed '$!d'
10
seq 1 10 |sed '1!g;h;$!d' 或 seq 1 10 |sed -n '1!g;h;$p' 倒序輸出
[root@centos7 ~]# seq 10|sed '1!g;h;$!d'109
8765
4321
seq 1 8 |sed -n 'n;p' 輸出偶數行
[root@centos7 ~]# seq 10|sed -n 'n;p'24
6810[root@centos7 ~]#
文字處理三劍客之sed
sed 工作原理 sed 即 stream editor,和 vi 不同,sed是行編輯器 sed是從檔案或管道中讀取一行,處理一行,輸出一行 再讀取一行,再處理一行,再輸出一行,直到 最後一行。每當處理一行時,把當前處理的行儲存在臨時緩衝區中,稱為模式空間 pattern space 接著用sed...
文字處理三劍客之sed
sed是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行儲存在臨時緩衝區中,稱為 模式空間 patternspace 接著用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往螢幕。然後讀入下行,執行下乙個迴圈。如果沒有使諸如 d 的特殊命令,那會在兩個迴圈之間清空模式空間,但不會清...
文字處理三劍客 sed
sed 是乙個編輯器,是乙個強大的檔案處理工具。sed作用 用來替換 刪除,更新檔案中的內容。sed能自動處理乙個或多個檔案。sed原理 sed是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行儲存在臨時緩衝區中,稱為 模式空間 pattern space 接著用sed命令處理緩衝區中的內容...