sed是一種流編輯器,它是文本處理中很是中的工具,可以完美的配合正則表達式使用,功能與衆不同。處理時,把當前處理的行存儲在臨時緩衝區中,稱爲「模式空間」(pattern space),接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。接着處理下一行,這樣不斷重複,直到文件末尾。文件內容並無 改變,除非你使用重定向存儲輸出。Sed主要用來自動編輯一個或多個文件;簡化對文件的反覆操做;編寫轉換程序等。html
-e command,--expression=command直接在指令列模式上進行 sed 的動做編輯;web
-n,--quiet,--silent:使用安靜(silent)模式。在通常 sed 的用法中,全部來自 STDIN的資料通常都會被列出到螢幕上。但若是加上 -n 參數後,則只有通過sed 特殊處理的那一行(或者動做)纔會被列出來。正則表達式
-f,--filer=script-file:直接將 sed 的動做寫在一個檔案內, -f filename 則能夠執行 filename 內的sed 動做;shell
-r, --regexp-extended:支持使用擴展正則表達式;express
-i[SUFFIX], --in-place[=SUFFIX]:直接編輯原文件 ;編輯器
a 在當前行後面加入一行文本。工具
b lable分支到腳本中帶有標記的地方,若是分支不存在則分支到腳本的末尾。ui
c 用新的文本改變本行的文本。spa
d 從模板塊(Pattern space)位置刪除行。.net
D 刪除模板塊的第一行。
i 在當前行上面插入文本。
h 拷貝模板塊的內容到內存中的緩衝區。
H 追加模板塊的內容到內存中的緩衝區
g 得到內存緩衝區的內容,並替代當前模板塊中的文本。
G 得到內存緩衝區的內容,並追加到當前模板塊文本的後面。
l 列表不能打印字符的清單。
n 讀取下一個輸入行,用下一個命令處理新的行而不是用第一個命令。
N 追加下一個輸入行到模板塊後面並在兩者間嵌入一個新行,改變當前行號碼。
p 打印模板塊的行。
P(大寫)打印模板塊的第一行。
q 退出Sed。
r file從file中讀行。
t labelif分支,從最後一行開始,條件一旦知足或者T,t命令,將致使分支到帶有標號的命令處,或者到腳本的末尾。
T label錯誤分支,從最後一行開始,一旦發生錯誤或者T,t命令,將致使分支到帶有標號的命令處,或者到腳本的末尾。
w file寫並追加模板塊到file末尾。
W file寫並追加模板塊的第一行到file末尾。
! 表示後面的命令對全部沒有被選定的行發生做用。
s/re/string/ 查找替換,其分隔符可自行指定,經常使用的有s@@@, s###等;
= 打印當前行號碼。
# 把註釋擴展到下一個換行符之前。
g 表示行內全面替換。
p 表示打印行。
w 表示把行寫入一個文件。
x 表示互換模板塊中的文本和緩衝區中的文本。
y 表示把一個字符翻譯爲另外的字符(可是不用於正則表達式)
\1 子串匹配標記
& 已匹配字符串標記
^錨定行的開始如:/^sed/
匹配全部以sed開頭的行。
$錨定行的結束 如:/sed$/
匹配全部以sed結尾的行。
.匹配一個非換行符的字符 如:/s.d/
匹配s後接一個任意字符,而後是d。
*匹配零或多個字符 如:/*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開頭的單詞的行。
\>;錨定單詞的結束,如/love\>/
匹配包含以love結尾的單詞的行。
x\{m\}重複字符x,m次,如:/0\{5\}/
匹配包含5個o的行。
x\{m,\}重複字符x,至少m次,如:/o\{5,\}/
匹配至少有5個o的行。
x\{m,n\}重複字符x,至少m次,很少於n次,如:/o\{5,10\}/
匹配5--10個o的行。
定址用於決定對哪些行進行編輯。地址的形式能夠是數字、正則表達式、或兩者的結合。若是沒有指定地址,sed將處理輸入文件的全部行。
空地址就是對全文進行處理。
單地址能夠匹配指定的行,也能夠按模式進行匹配。
#(數字):匹配指定的行。
/pattern/:被此模式所匹配到的每一行。
#,#:從#行到#行匹配。
#,+#:從#行到以後的#行匹配。
#,/pat1/:從#行開始到以後第一個pat1模式匹配。
/pat1/,/pat2/:從pat1模式到pat2模式之間匹配。
$:最後一行
1~2:全部奇數行
2~2:全部偶數行
命令p用於顯示模式空間的內容。默認狀況下,sed把輸入行打印在屏幕上,選項-n用於取消默認的打印操做。當選項-n和命令p同時出現時,sed可打印選定的內容。
# sed '/root/p' filename
若是某行匹配模式root,p命令將把該行另外打印一遍。
# sed -n '/root/p'
選項-n取消sed默認的打印,p命令把匹配模式root的行打印一遍。
# sed -n '1p' filename
顯示第一行。
# sed -n '$p' filename
顯示最後一行。
# sed -n '2,5p' filename
顯示第二到第五行。
# sed -n '5,$p' filename
顯示第五行到最後一行。
命令d用於刪除輸入行。sed先將輸入行從文件複製到模式空間裏,而後對該行執行sed命令,最後將模式空間裏的內容顯示在屏幕上。若是發出的是命令d,當前模式空間裏的輸入行會被刪除,不被顯示。
# sed '1d' filename
刪除第一行。
# sed '$d' filename
刪除最後一行。
# sed '2,5d' filename
第二行到第五行刪除。
# sed '5,$d' filename
第五行以後的行刪除。
i\ 命令是在當前行的前面插入新的文本。
# sed '1i\test' filename
在第一行錢插入test。
# sed '2,5i\test' filename
在第二行到第五行前插入test。
# sed '2,5i\test\ntest' filename
上面是添加兩行test。使用\n換行符。
使用方法和前面的i同樣只不過插入的位置的區別。
在使用c 命令時是將匹配的行替換成指定的內容。
r命令是讀命令。sed使用該命令將一個文本文件中的內容經過匹配添加到文件的特定位置上。
# sed '/root/r test.txt' filename
讀入的文件須要指定正確的位置,上面的例子中先匹配root行而後在其後的下一行讀入test.txt文件的內容。若是匹配的root有多個則添加屢次。
w 是寫入文件,其是將匹配的內容寫入到指定的文件中。
# sed '2,5w aaa' filename
上面的例子是匹配filename的第二到第五行,並將其寫入到當前路徑的aaa文件中。
# cat test dota dota dota df dota dota dota ta dota dota sa ss dota # sed 's/dota/DOTA/' test DOTA dota dota df DOTA dota dota ta DOTA DOTA sa ss DOTA
將文件匹配行的第一個dota替換成DOTA。
# sed 's/dota/DOTA/g' test DOTA DOTA DOTA df DOTA DOTA DOTA ta DOTA DOTA sa ss DOTA
這個是全局替換。
# sed 's/dota/DOTA/2g' test dota DOTA DOTA df dota DOTA DOTA ta dota dota sa ss dota
將匹配行的第二個dota開始的全部DOTA 替換成ROOT。
# sed 's/dota/DOTA/2' test dota DOTA dota df dota DOTA dota ta dota dota sa ss dota
將文件匹配行第二個root替換DOTA。
# sed -n 's/dota/DOTA/2p' test dota DOTA dota df dota DOTA dota
將匹配替換的行給打印出來。
# sed 's/^/#/' test #dota dota dota #df dota dota dota #ta dota # dota sa #ss dota
給文件每行的前面添加#符。
# sed 's/^..//' test ta dota dota dota dota dota dota ota sa dota
刪除文件的前兩個字符。
# sed 's/.//3' test doa dota dota dfdota dota dota tadota dta sa ssdota
刪除第三個字符。
正則表達式\w+ 匹配每個單詞,使用[&] 替換它,& 對應於以前所匹配的單詞。
# sed 's/\w\+/[&]/' test [dota] dota dota [df] dota dota dota [ta] dota [dota] sa [ss] dota
將每行的第一個單詞加上[]符號。若是想所有都加速使用g 進行替換標記。
# sed 's/\<dota\>/cn_&/' test cn_dota dota dota df cn_dota dota dota ta cn_dota cn_dota sa ss cn_dota
將每行第一個的dota字符串加上cn_。
# sed -r 's/(^.*)(:.*:)(.*$)/\3\2\1/' /etc/passwd
將/etc/passwd 文件中以:爲分隔符把第一個字串後最後一個字串互換。
# echo dota |sed -r 's/([a-z]+)/\1er/' dotaer
將匹配的字串後面添加指定的字符。
# sed -r '1,2s/dota/DOTA/g; 3,$s/(dota)/\1er/g' test DOTA DOTA DOTA df DOTA DOTA DOTA ta dotaer dotaer sa ss dotaer
將前兩行的dota 改爲DOTA,把第三行開始到最後的全部dota 後添加er。
# sed -r -e '1,2s/dota/DOTA/g' -e '3,$s/(dota)/\1er/g' test DOTA DOTA DOTA df DOTA DOTA DOTA ta dotaer dotaer sa ss dotaer
上面兩個的效果相同。
# sed '1,2s/dota/DOTA/g' test |sed -r '3,$s/(dota)/\1er/g' DOTA DOTA DOTA df DOTA DOTA DOTA ta dotaer dotaer sa ss dotaer
也能夠經過管道的方式實現。
刪除/boot/grub2/grub.cfg文件中全部以空白字符開頭的行的行首的全部空白字符;
# sed -r 's/(^[[:space:]]+)(.*)/\2/' /boot/grub2/grub.cfg # sed 's@^[[:space:]]\+@@' /boot/grub2/grub.cfg
刪除/etc/fstab文件中全部以#開頭的行的行首的#號及#後面的全部空白字符;
# sed 's/^#[[:space:]]*//' /etc/fstab
輸出一個絕對路徑給sed命令,取出其目錄,其行爲相似於dirname;
# echo "/var/log/messages/" | sed 's@[^/]\+/\?$@@' # echo "/var/log/messages" | sed -r 's@[^/]+/?$@@'
將第一行的內容放到打三行後面
# cat bbb 11111 22222 33333 44444 55555 # sed '1h;3G' bbb 11111 22222 33333 11111 44444 55555
在每行的後面添加1個空行
注:1.保留空間裏默認有一個空白行。2,‘G’默認處理全局
# sed '1,$G' bbb 11111 22222 33333 44444 55555 # sed 'G' bbb 11111 22222 33333 44444 55555
把第1行到第4行的數據複製到第5行後面
注:1h是爲了覆蓋保留空間裏的空白行
# sed '1h;2,4H;5G' bbb 11111 22222 33333 44444 55555 11111 22222 33333 44444
把第1行到第4行的數據剪切到第5行後面
# sed '1h;2,4H;1,4d;5G' bbb 55555 11111 22222 33333 44444
# sed -n '1n;p' bbb 22222 33333 44444 55555
# sed '1h;3x' bbb 11111 22222 11111 44444 55555
圖片鏈接:http://coolshell.cn/articles/9104.html
參考與擴展:
http://sed.sourceforge.net/sed1line_zh-CN.html
http://tanxin.blog.51cto.com/6114226/1208944
http://coolshell.cn/articles/9104.html