Sed是非交互式的行編輯器. 它即可以從stdin中接收文本輸入, 也可以從文件中接收文本輸入,
它對輸入中的指定行進行特定的操作, 一行操作一次, 然后將結果輸出到stdout, 或輸出到文件中.
在shell腳本中使用的話, sed通常都是作為管道工具鏈中的一個處理部分來使用.
Sed會決定它需要處理那些行, 因為sed的參數就包含有地址范圍. 既可以通過行號來指定地址范圍,
也可以通過模式匹配來決定地址范圍. 比如, 3d表示sed會刪除輸入的第3行, /windows/d表示sed會刪除掉所有匹配"windows"的輸入行.
對于sed工具包的所有操作來說, 我們最關心的其實就是3個最主要的操作. 分別是printing(打印到stdout), deletion(刪除), 和substitution(替換).
表格 C-1. 基本sed操作
操作符 |
名字 |
效果 |
[地址范圍]/p |
打印 |
打印[指定的地址范圍] |
[地址范圍]/d |
刪除 |
刪除[指定的地址范圍] |
s/pattern1/pattern2/ |
替換 |
將指定行中, 將第一個匹配到的pattern1, 替換為pattern2. |
[地址范圍]/s/pattern1/pattern2/ |
替換 |
在地址范圍指定的每一行中, 將第一個匹配到的pattern1,
替換為pattern2. |
[地址范圍]/y/pattern1/pattern2/ |
transform |
在地址范圍指定的每一行中,
將pattern1中的每個匹配到pattern2的字符都使用pattern2的相應字符作替換. (等價于tr命令) |
g |
全局 |
在每個匹配的輸入行中, 將每個模式匹配都作相應的操作. (譯者注: 不只局限于第一個匹配)
|
 |
除非在替換命令的后邊明確指定選項g (全局), 否則的話,
替換操作只會替換掉每行上的第一個模式匹配實例. |
如果在命令行或腳本中使用這個命令, sed操作可能還需要某些選項和引用.
1 sed -e '/^$/d' $filename
2 # -e選項, 將會使得后邊的字符被看作為編輯指令.
3 # (如果只給"sed"傳遞了單個指令, 那么"-e"是可選的.)
4 # "強"引用('')將會保護指令中的RE(正則表達式)字符串,
5 #+ 也就是防止腳本將RE重新解釋為特殊字符.
6 # (這會為sed命令, 保存指令的RE表達式.)
7 #
8 # 將會對文件$filename中的文本進行操作. |
在某些特定的情況下, sed編輯命令將不會和單引號的強引用一起工作.
1 filename=file1.txt
2 pattern=BEGIN
3
4 sed "/^$pattern/d" "$filename" # 工作正常.
5 # sed '/^$pattern/d' "$filename" 就會出現異常的結果.
6 # 在這個實例中, 被強引用(' ... ')引起的
7 #+ "$pattern"就不會擴展為"BEGIN". |
 |
Sed命令的-e 選項表示后續的字符串是一個指令, 或指令集. 如果后續的字符串中只有一個指令,
那么-e 選項可以被省略. |
1 sed -n '/xzy/p' $filename
2 # -n選項會讓sed只打印那些匹配模式的行.
3 # 否則所有的輸入行都會被打印.
4 # 這里可以省略-e選項, 因為這里只有一個編輯指令. |
表格 C-2. sed操作符舉例
表示法 |
效果 |
8d |
刪除輸入的第8行. |
/^$/d |
刪除所有空行. |
1,/^$/d |
從輸入的開頭一直刪除到第1個空行(第一個空行也刪除掉). |
/Jones/p |
只打印那些包含"Jones"的行(使用-n選項).
|
s/Windows/Linux/ |
在每個輸入行中, 將第一個出現的"Windows"實例替換為"Linux". |
s/BSOD/stability/g |
在每個輸入行中, 將所有"BSOD"都替換為"stability". |
s/ *$// |
刪除掉每行結尾的所有空格. |
s/00*/0/g |
將所有連續出現的0都壓縮成單個的0. |
/GUI/d |
刪除掉所有包含"GUI"的行. |
s/GUI//g |
將所有"GUI"都刪除掉, 并保持剩余部分的完整性.
|
在輸入行中, 將一個字符串替換為空字符, 等價于刪除這個字符串. 剩余部分會保持完整. 比如s/GUI//, 拿下邊這句為例:
The most important parts of any application are its GUI and sound effects |
結果為:
The most important parts of any application are its and sound effects |
反斜線將會強制sed替換命令延續到下一行. 類似于,
在第一行的結尾使用換行作為替換字符串.
這將每行開頭的空格用換行來替換.
最后的結果就是將每段的縮進替換為一個空行.
地址范圍后邊可以加上一系列操作, 這些操作可能需要放到大括號對中, 并且需要重起一行.
1 /[0-9A-Za-z]/,/^$/{
2 /^$/d
3 } |
這只會刪除連續空行中的第一行. 對于單行間距的文本文件來說, 這很有用,
但是會保留段落間的空行.