1.簡(jiǎn)介
sed是非交互式的編輯器楞遏。它不會(huì)修改文件,除非使用shell重定向來(lái)保存結(jié)果霹期。默認(rèn)情況下,所有的輸出行都被打印到屏幕上拯田。
sed編輯器逐行處理文件(或輸入)历造,并將結(jié)果發(fā)送到屏幕。具體過(guò)程如下:首先sed把當(dāng)前正在處理的行保存在一個(gè)臨時(shí)緩存區(qū)中(也稱為模式空間)船庇,然后處理臨時(shí)緩沖區(qū)中的行吭产,完成后把該行發(fā)送到屏幕上。sed每處理完一行就將其從臨時(shí)緩沖區(qū)刪除鸭轮,然后將下一行讀入臣淤,進(jìn)行處理和顯示。處理完輸入文件的最后一行后窃爷,sed便結(jié)束運(yùn)行邑蒋。sed把每一行都存在臨時(shí)緩沖區(qū)中,對(duì)這個(gè)副本進(jìn)行編輯按厘,所以不會(huì)修改原文件寺董。
2.定址
定址用于決定對(duì)哪些行進(jìn)行編輯。地址的形式可以是數(shù)字刻剥、正則表達(dá)式、或二者的結(jié)合滩字。如果沒(méi)有指定地址造虏,sed將處理輸入文件的所有行。
地址是一個(gè)數(shù)字麦箍,則表示行號(hào)漓藕;是“$"符號(hào),則表示最后一行挟裂。例如:
sed -n '3p' datafile
只打印第三行
只顯示指定行范圍的文件內(nèi)容享钞,例如:
# 只查看文件的第100行到第200行
sed -n '100,200p' mysql_slow_query.log
地址是逗號(hào)分隔的,那么需要處理的地址是這兩行之間的范圍(包括這兩行在內(nèi))诀蓉。范圍可以用數(shù)字栗竖、正則表達(dá)式、或二者的組合表示渠啤。例如:
sed '2,5d' datafile
#刪除第二到第五行
sed '/My/,/You/d' datafile
#刪除包含"My"的行到包含"You"的行之間的行
sed '/My/,10d' datafile
#刪除包含"My"的行到第十行的內(nèi)容
3.命令與選項(xiàng)
sed命令告訴sed如何處理由地址指定的各輸入行狐肢,如果沒(méi)有指定地址則處理所有的輸入行。
3.1 sed命令
命令 功能
a\ 在當(dāng)前行后添加一行或多行沥曹。多行時(shí)除最后一行外份名,每行末尾需用“\”續(xù)行
c\ 用此符號(hào)后的新文本替換當(dāng)前行中的文本碟联。多行時(shí)除最后一行外,每行末尾需用"\"續(xù)行
i\ 在當(dāng)前行之前插入文本僵腺。多行時(shí)除最后一行外鲤孵,每行末尾需用"\"續(xù)行
d 刪除行
h 把模式空間里的內(nèi)容復(fù)制到暫存緩沖區(qū)
H 把模式空間里的內(nèi)容追加到暫存緩沖區(qū)
g 把暫存緩沖區(qū)里的內(nèi)容復(fù)制到模式空間,覆蓋原有的內(nèi)容
G 把暫存緩沖區(qū)的內(nèi)容追加到模式空間里辰如,追加在原有內(nèi)容的后面
l 列出非打印字符
p 打印行
n 讀入下一輸入行普监,并從下一條命令而不是第一條命令開(kāi)始對(duì)其的處理
q 結(jié)束或退出sed
r 從文件中讀取輸入行
! 對(duì)所選行以外的所有行應(yīng)用命令
s 用一個(gè)字符串替換另一個(gè)
g 在行內(nèi)進(jìn)行全局替換
w 將所選的行寫(xiě)入文件
x 交換暫存緩沖區(qū)與模式空間的內(nèi)容
y 將字符替換為另一字符(不能對(duì)正則表達(dá)式使用y命令)
3.2 sed選項(xiàng)
選項(xiàng) 功能
-e 進(jìn)行多項(xiàng)編輯,即對(duì)輸入行應(yīng)用多條sed命令時(shí)使用
-n 取消默認(rèn)的輸出
-f 指定sed腳本的文件名
4.退出狀態(tài)
sed不向grep一樣丧没,不管是否找到指定的模式鹰椒,它的退出狀態(tài)都是0。只有當(dāng)命令存在語(yǔ)法錯(cuò)誤時(shí)呕童,sed的退出狀態(tài)才不是0漆际。
5.正則表達(dá)式元字符
與grep一樣,sed也支持特殊元字符夺饲,來(lái)進(jìn)行模式查找奸汇、替換。不同的是往声,sed使用的正則表達(dá)式是括在斜杠線"/"之間的模式擂找。
如果要把正則表達(dá)式分隔符"/"改為另一個(gè)字符,比如o浩销,只要在這個(gè)字符前加一個(gè)反斜線贯涎,在字符后跟上正則表達(dá)式,再跟上這個(gè)字符即可慢洋。例如:sed -n '\o^Myop' datafile
元字符 功能 示例
^ 行首定位符 /^my/? 匹配所有以my開(kāi)頭的行
$ 行尾定位符 /my$/? 匹配所有以my結(jié)尾的行
. 匹配除換行符以外的單個(gè)字符 /m..y/? 匹配包含字母m塘雳,后跟兩個(gè)任意字符,再跟字母y的行
* 匹配零個(gè)或多個(gè)前導(dǎo)字符 /my*/? 匹配包含字母m,后跟零個(gè)或多個(gè)y字母的行
[] 匹配指定字符組內(nèi)的任一字符 /[Mm]y/? 匹配包含My或my的行
[^] 匹配不在指定字符組內(nèi)的任一字符 /[^Mm]y/? 匹配包含y普筹,但y之前的那個(gè)字符不是M或m的行
\(..\) 保存已匹配的字符 1,20s/\(you\)self/\1r/? 標(biāo)記元字符之間的模式败明,并將其保存為標(biāo)簽1,之后可以使用\1來(lái)引用它太防。最多可以定義9個(gè)標(biāo)簽妻顶,從左邊開(kāi)始編號(hào),最左邊的是第一個(gè)蜒车。此例中讳嘱,對(duì)第1到第20行進(jìn)行處理,you被保存為標(biāo)簽1酿愧,如果發(fā)現(xiàn)youself呢燥,則替換為your。
& 保存查找串以便在替換串中引用 s/my/**&**/? 符號(hào)&代表查找串寓娩。my將被替換為**my**
\< 詞首定位符 /\<my/? 匹配包含以my開(kāi)頭的單詞的行
\> 詞尾定位符 /my\>/? 匹配包含以my結(jié)尾的單詞的行
x\{m\} 連續(xù)m個(gè)x /9\{5\}/ 匹配包含連續(xù)5個(gè)9的行
x\{m,\} 至少m個(gè)x /9\{5,\}/? 匹配包含至少連續(xù)5個(gè)9的行
x\{m,n\} 至少m個(gè)叛氨,但不超過(guò)n個(gè)x /9\{5,7\}/? 匹配包含連續(xù)5到7個(gè)9的行
6.范例
6.1 p命令
命令p用于顯示模式空間的內(nèi)容呼渣。默認(rèn)情況下,sed把輸入行打印在屏幕上寞埠,選項(xiàng)-n用于取消默認(rèn)的打印操作屁置。當(dāng)選項(xiàng)-n和命令p同時(shí)出現(xiàn)時(shí),sed可打印選定的內(nèi)容。
sed '/my/p' datafile
#默認(rèn)情況下仁连,sed把所有輸入行都打印在標(biāo)準(zhǔn)輸出上蓝角。如果某行匹配模式my,p命令將把該行另外打印一遍饭冬。
sed -n '/my/p' datafile
#選項(xiàng)-n取消sed默認(rèn)的打印使鹅,p命令把匹配模式my的行打印一遍。
6.2 d命令
命令d用于刪除輸入行昌抠。sed先將輸入行從文件復(fù)制到模式空間里患朱,然后對(duì)該行執(zhí)行sed命令,最后將模式空間里的內(nèi)容顯示在屏幕上炊苫。如果發(fā)出的是命令d裁厅,當(dāng)前模式空間里的輸入行會(huì)被刪除,不被顯示侨艾。
sed '$d' datafile
#刪除最后一行执虹,其余的都被顯示
sed '/my/d' datafile
#刪除包含my的行,其余的都被顯示
6.3 s命令
sed 's/^My/You/g' datafile
#命令末端的g表示在行內(nèi)進(jìn)行全局替換唠梨,也就是說(shuō)如果某行出現(xiàn)多個(gè)My袋励,所有的My都被替換為You。加了^號(hào)過(guò)后只會(huì)替換以My開(kāi)頭的第一個(gè)匹配項(xiàng)当叭。
Sed ‘s/My/You/g’datafile? #替換所有行里My為You
Sed ‘s/My/You/’ datafile? #替換所有行里面第一個(gè)匹配的My為You
Sed ‘s/^My/You’datafile與Sed‘s/^My/You/g' datafile效果一致
sed -n '1,20s/My$/You/gp' datafile
#取消默認(rèn)輸出插龄,處理1到20行里匹配以My結(jié)尾的行,把行內(nèi)所有的My替換為You科展,并打印到屏幕上。
sed 's#My#Your#g' datafile
#緊跟在s命令后的字符就是查找串和替換串之間的分隔符糠雨。分隔符默認(rèn)為正斜杠才睹,但可以改變。無(wú)論什么字符(換行符甘邀、反斜線除外)琅攘,只要緊跟s命令,就成了新的串分隔符松邪。
6.4 e選項(xiàng)
-e是編輯命令坞琴,用于sed執(zhí)行多個(gè)編輯任務(wù)的情況下。在下一行開(kāi)始編輯前逗抑,所有的編輯動(dòng)作將應(yīng)用到模式緩沖區(qū)中的行上剧辐。
sed -e '1,10d' -e 's/My/Your/g' datafile
#選項(xiàng)-e用于進(jìn)行多重編輯寒亥。第一重編輯刪除第1-3行。第二重編輯將出現(xiàn)的所有My替換為Your荧关。因?yàn)槭侵鹦羞M(jìn)行這兩項(xiàng)編輯(即這兩個(gè)命令都在模式空間的當(dāng)前行上執(zhí)行)溉奕,所以編輯命令的順序會(huì)影響結(jié)果。
6.5 r命令
r命令是讀命令忍啤。sed使用該命令將一個(gè)文本文件中的內(nèi)容加到當(dāng)前文件的特定位置上加勤。
sed '/My/r introduce.txt' datafile
#如果在文件datafile的某一行匹配到模式My,就在該行后讀入文件introduce.txt的內(nèi)容同波。如果出現(xiàn)My的行不止一行鳄梅,則在出現(xiàn)My的各行后都讀入introduce.txt文件的內(nèi)容。
6.6 w命令
sed -n '/hrwang/w me.txt' datafile
#
6.7 a\ 命令
a\ 命令是追加命令未檩,追加將添加新文本到文件中當(dāng)前行(即讀入模式緩沖區(qū)中的行)的后面戴尸。所追加的文本行位于sed命令的下方另起一行。如果要追加的內(nèi)容超過(guò)一行讹挎,則每一行都必須以反斜線結(jié)束校赤,最后一行除外。最后一行將以引號(hào)和文件名結(jié)束筒溃。
sed '/^hrwang/a\
>hrwang and mjfan are husband\
>and wife' datafile
#如果在datafile文件中發(fā)現(xiàn)匹配以hrwang開(kāi)頭的行马篮,則在該行下面追加hrwang and mjfan are husband and wife
6.8 i\ 命令
i\ 命令是在當(dāng)前行的前面插入新的文本。
6.9 c\ 命令
sed使用該命令將已有文本修改成新的文本怜奖。
6.10 n命令
sed使用該命令獲取輸入文件的下一行浑测,并將其讀入到模式緩沖區(qū)中,任何sed命令都將應(yīng)用到匹配行緊接著的下一行上歪玲。
sed '/hrwang/{n;s/My/Your/;}' datafile
注:如果需要使用多條命令迁央,或者需要在某個(gè)地址范圍內(nèi)嵌套地址,就必須用花括號(hào)將命令括起來(lái)滥崩,每行只寫(xiě)一條命令岖圈,或這用分號(hào)分割同一行中的多條命令。
6.11 y命令
該命令與UNIX/Linux中的tr命令類似钙皮,字符按照一對(duì)一的方式從左到右進(jìn)行轉(zhuǎn)換蜂科。例如,y/abc/ABC/將把所有小寫(xiě)的a轉(zhuǎn)換成A短条,小寫(xiě)的b轉(zhuǎn)換成B导匣,小寫(xiě)的c轉(zhuǎn)換成C。
sed '1,20y/hrwang12/HRWANG^$/' datafile
#將1到20行內(nèi)茸时,所有的小寫(xiě)hrwang轉(zhuǎn)換成大寫(xiě)贡定,將1轉(zhuǎn)換成^,將2轉(zhuǎn)換成$。
#正則表達(dá)式元字符對(duì)y命令不起作用可都。與s命令的分隔符一樣缓待,斜線可以被替換成其它的字符蚓耽。
6.12 q命令
q命令將導(dǎo)致sed程序退出,不再進(jìn)行其它的處理命斧。
sed '/hrwang/{s/hrwang/HRWANG/;q;}' datafile
6.13 h命令和g命令
#cat datafile
My name is hrwang.
Your name is mjfan.
hrwang is mjfan's husband.
mjfan is hrwang's wife.
sed -e '/hrwang/h' -e '$G' datafile
sed -e '/hrwang/H' -e '$G' datafile
#通過(guò)上面兩條命令田晚,你會(huì)發(fā)現(xiàn)h會(huì)把原來(lái)暫存緩沖區(qū)的內(nèi)容清除,只保存最近一次執(zhí)行h時(shí)保存進(jìn)去的模式空間的內(nèi)容国葬。而H命令則把每次匹配hrwnag的行都追加保存在暫存緩沖區(qū)贤徒。
sed -e '/hrwang/H' -e '$g' datafile
sed -e '/hrwang/H' -e '$G' datafile
#通過(guò)上面兩條命令,你會(huì)發(fā)現(xiàn)g把暫存緩沖區(qū)中的內(nèi)容替換掉了模式空間中當(dāng)前行的內(nèi)容汇四,此處即替換了最后一行接奈。而G命令則把暫存緩沖區(qū)的內(nèi)容追加到了模式空間的當(dāng)前行后。此處即追加到了末尾通孽。
7. sed腳本
sed腳本就是寫(xiě)在文件中的一列sed命令序宦。腳本中,要求命令的末尾不能有任何多余的空格或文本背苦。如果在一行中有多個(gè)命令互捌,要用分號(hào)分隔。執(zhí)行腳本時(shí)行剂,sed先將輸入文件中第一行復(fù)制到模式緩沖區(qū)秕噪,然后對(duì)其執(zhí)行腳本中所有的命令。每一行處理完畢后厚宰,sed再?gòu)?fù)制文件中下一行到模式緩沖區(qū)腌巾,對(duì)其執(zhí)行腳本中所有命令。使用sed腳本時(shí)铲觉,不再用引號(hào)來(lái)確保sed命令不被shell解釋澈蝙。例如sed腳本script:
#handle datafile
3i\
~~~~~~~~~~~~~~~~~~~~~
3,$s/\(hrwang\) is \(mjfan\)/\2 is \1/
$a\
We will love eachother forever!撵幽!
#sed -f script datafile
My name is hrwang
Your name is mjfan
~~~~~~~~~~~~~~~~~~~~~
mjfan is hrwang's husband.? ? ? ? ? #啦啦~~~
mjfan is hrwang's wife.
We will love eachother forever5朴!