sed是什么?
sed是Stream EDitor的縮寫,man中對sed的簡介為
sed - stream editor for filtering and transforming text
?的主要功能是對文本的過濾與替換。
sed的工作原理
sed的工作過程:sed是一個流編輯器,所謂流編輯器是指sed每次只從文件或stdin中讀入一行,將讀入的行保存至模式空間然后根據指定的要求對其進行處理,并將處理后的結果輸出至屏幕,接著讀入下一行,整個文本的過程如流水線般被逐行處理后輸出。
sed對內容的處理方式:sed不是在原文件中或原輸入上直接進行處理的,它將讀入的行放入緩存區,對緩存區里的內容進行處理,處理完畢后默認不會寫入或覆蓋源文件,而是直接輸出到屏幕上。
它有兩個內存緩沖區分別叫做:模式空間(pattern space)、保持空間也有稱作暫存緩存區(holding space)。
一般情況下sed首先把第一行裝入模式空間,進行處理后輸出屏幕,然后第二行裝入模式空間替換掉模式空間里原來的內容,再進行處理,依次循環,直至結束。
下面是我對sed工作流程的理解圖。

1、sed每次將stdin中的內容中的一行讀入模式空間
2、之后根據模式空間中的匹配條件進行匹配,符合條件進入下一階段即普通編輯,不滿足則默認至標準輸出,結束
3、普通編輯之后分三個階段,1)普通編輯之后選擇性顯示至STDOUT,結束;2)進入holding space進行高級編輯,編輯結束后選擇性顯示至模式空間,之后再次根據編輯命令重復2-3過程;3)若是出現多編輯命令則需要再返回模式空間根據編輯條件再次進行2-3步驟。
限于個人理解程度上述的理解免不了跟真實的工作流程有些出入,大家要抱著質疑的態度去看,我寫的不一定都是對的,不過錯的應該不至于很多。
sed語法
sed OPTIONS... <SCRIPT> [INPUTFILE...]
[SCRIPT]:可以理解為地址定界加編輯命令。
常用選項:
-n:不輸出模式空間中的內容至屏幕;通俗點可以理解為它可以自動過濾掉模式空間中未匹配到的行,-n 要與命令編輯中的p合用(命令編輯?下文),用于顯示模式空間中被匹配到的內容。
suppress automatic printing of pattern space
-n的具體應用見后面的sed編輯高級命令演示
-e:多點編輯
add the script to the commands to be executed
-f:每行一個編輯命令
add the contents of script-file to the commands to be executed
-r:使用擴展表達式
use extended regular expressions in the script.
-i:直接編輯原文件
edit files in place (makes backup if SUFFIX supplied)
SCRIPT:
之前對這塊很迷糊,因為info中sed顯示語法有[]表示可加可不加,于是就在sed后直接加想要編輯的文本
于是就出現如下情況
1 2 | [root@localhost test ]
sed :-e 表達式
|
報錯信息沒找到終止的限制條件,所以上面的sed語法格式并不準確。
通過實驗,sed可以不加[OPTION]但是[SCRIPT]則必須添加
SCRIPT分兩部分:地址定界(用于限定編輯文本的范圍)、編輯命令(用于對匹配到的內容進行什么樣的操作或編輯),前者可少后者必不可少,如果沒有編輯的命令會發生如下錯誤
1 2 3 4 5 6 7 8 9 10 | [root@localhost test ]
sed :-e 表達式
[root@localhost test ]
hi,everyone
now I will show how to use cat
[root@localhost test ]
hi,everyone
hi,everyone
now I will show how to use cat
now I will show how to use cat
|
地址定界?
1、空地址:對全文處理。
2、單地址:
#:指定行;
/pattern/:被此模式所匹配到的每一行;
3、地址范圍:
#,#:從#開始到#結束的所有行
#,+#:從#開始向下至+#的行之間的所有行
#,/pat1/ 從#開始至匹配到第一次出現/pat1/模式的行之間的所有行
/pat1/,/pat2/:第一次匹配到/pat1/的行到第一次匹配到/pat2/的行之間的所有行
4、步進:~
1~2:所有奇數行 2~2:所有偶數行
編輯命令:若少了編輯命令會報錯,編輯命令在SCRIPT中至少出現一次。
d:刪除模式空間中匹配到的內容 delete pattern space
a ext 在行后面插入文本“text”,支持使用
實現多行插入
Append text, which has each embedded newline preceded by a back slash.
i ext 在行前面插入文本“text”,支持使用
實現多行插入
Insert text, which has each embedded newline preceded by a back slash.
c ext 把匹配到的行替換為此處指定的文本“text”
replace the selected lines with text, which has each embedded new line preceded by a backslash.
w filename 保存模式空間匹配的行至指定的文件中
Write the current pattern space to filename.
r filename 讀取指定文件內容至當前文件被模式匹配到的行文件后合并
Append text read from filename.
= : 為模式匹配到的行打印行號 Print the current line number.
!: 條件取反(它比較特殊,它必須跟其他編輯命令一起使用)
s/regexp/replacement/ : 查找替換,其分隔符可自行指定,常用有s@@@,s###
它有一個特殊的用法s//x&/:表示將被查找的內容在其前面添加x內容
s//&x/:表示將被查找的內容在其后面添加x內容
&代表被查找的內容
1 2 3 4 5 6 7 8 9 | [root@localhost test ]
hi,everyone
now I will show how to use cat
[root@localhost test ]
hi,e
now I will show how to use
[root@localhost test ]
hi,
now I will show how to us
|
p :顯示替換成功的行
g :全局替換
w filename : 將替換成功的結果保存至指定文件中
查找替換在sed中應用很廣,下面很多例子都是以sed的替換功能實現的
p :顯示當前模式空間中的內容 Print the current pattern space.
注:同時使用多個編輯命令,命令之間要用;隔開(!除外)
例子如下:
1 2 3 4 5 6 7 | [root@localhost test ]
hi,everyone
1
hi,everyone
now I will show how to use cat
2
now I will show how to use cat
|
實例演示:
1、刪除/etc/grub2.conf文件中所有以空白開頭的行行首的空白字符
1 | sed 's#^[[:space:]]+##' /etc/grub2 .cfg
|
這里##是將前面匹配到的內容刪除的意思,上面文本內容太多,就不截取了。
2、刪除/etc/fstab文件中所有以#開頭,后面至少跟一個空白字符的行的行首的#號及#后面的所有空白字符
1 | sed 's@^#[[:space:]]+@@' /etc/fstab
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | [root@localhost test]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Tue Jul 19 23:52:41 2016
-
售前咨詢
售前咨詢服務時間:09:00-23:30
售前值班
4006-75-4006
咨詢熱線:
4006-75-4006(09:00-23:30)
0871-6388 6388 (總機)(工作日 09:00-18:00)
-
售后咨詢
售后咨詢服務時間:00:00-24:00
24H值班技術
4006-75-4006
-
備案咨詢
備案咨詢服務時間:09:00-18:00(工作日)
備案專業客服
0871-6388 6388
-
電話
0871-6388 6388 (總機)
- 工單
-
二維碼
-
TOP
|