sed是一個流編輯器,通過多種類型轉換來修改流經它的的文本。sed不會改變提供給它的源文件,而是把改變後的結果發送到stdout.
sed中每次處理一行。
sed的元字符有
.*[]^${}/+?|()
元字符用法:
除^外,其他符號在[]內如果要匹配自己本身字符要加/,否則是元字符的意義。^在[]內開頭表示否定,在[]內的其他地方表示本身字符。
^ 還可用於匹配一行的開頭;$用於匹配一行的結尾。
/^The/ 匹配以“The”開頭的行
/end.$/ 匹配以“end.”結尾的行
/^T.*/.$/ 匹配以“T”開頭以“.”結尾的行
/dog/匹配所有出現的“dog”
/t.m/匹配所有先出現t,然後隔一個字符再出現m的字符,如tim,tom等。
/(<expresion>
/(<expresion>
/) 括號的分組用法
/{1,4/} 限制次數的用法
* 前面的字符0個或多個
/+ 前面的字符1個或多個
& 在替換域中使用表示整個匹配部分,如s/hat/"&"/,&表示前面兩個/之間部分
[[:alpha:]]匹配任意字母字符,大寫或小寫
[[:alnum:]]匹配任意字母數字字符,相當於[0-9A-Za-z]
[[:blank:]]匹配空格或製表字符
[[:digit:]]匹配數字,相當於[0-9]
[[:lower:]]相當於[a-z]
[[:upper:]]相當於[A-Z]
[[:print:]]匹配任意可打印字符
[[:punct:]]匹配標點符號
[[:space:]]匹配任意空白字符,包括空格、製表符、NL、FF、VT、CR
sed一些常用選項:
-n 抑制自動輸出(用命令p,P輸出)
-i 直接修改文件內容
sed的執行流程:
a)開始時,把第一行讀入模式空間。
b)把命令逐一應用到模式空間,如果沒有其他控制干預,則所有命令執行完後就會到達腳本尾部,這時輸出模式空間的內容,然後清除模式空間。
c)讀入下一行(永遠記住當前行是模式空間中行號最大的那行,特別是用到N命令和控制流程改變時往往很容易搞錯下一行是什麼),重複b)過程。
上面說的“其他控制干預”包括標號的跳轉,D命令。D命令刪除模式空間中的第一個/n之前(包括這個/n)的所有內容,保留第一個/n之後的內容,然後返回腳本開始處。(有些死循環導致不能到達腳本最後,死循環中又沒有用p,P命令,這時有內容輸出是由於一些命令有立刻輸出模式空間的功能(如n輸出模式空間的內容然後讀入下一行而不用返回腳本頂端)。最好還是不要依賴sed的自動輸出了,自己顯式p吧)。
典型的sed命令行選項:
替換(s)
替換指令格式如下:sed [address1[,address2]] s/pattern/replacement/[n|g] filename
標誌g表示對文本全部行進行操作;標誌n表示將要替換第n次 出現的表達式。
sed 's/this/that/' file.txt 把輸入文件中每一行第一次出現的this替換爲that. 與下句效果等同:
sed 's/this/that/1' file.txt
如果要把第二次出現的this替換爲that,把n設置爲2即可。
sed 's/is/IS/g' file.txt 整個文件中出現的每個is都被IS取代
5s/this/that/ 把第五行的this 替換爲that,僅對第五行進行這個操作。
1,5s/this/that/ 1,5表示從第一行到第五行,把第一行到第五行的this 替換爲that,僅對第五行進行這個操作。
5,$s/this/that/ $ 把最後五行的this 替換爲that
5,$!s/this/that/ !不要對給出的行進行操作, 即不要對最後五行的this 替換爲that
也可以指定樣式的範圍,而不僅是行數的範圍,如:
sed '/^The/s/this/that/' 把所有以The開頭的行進行替換。
sed '/start/,/end/s/index/idx/g' 對從包含start的行到包含end的行之間所有行進行替換操作。
刪除(d)
sed '1,5d' file.txt 刪除文件的前5行
應用!來反轉約束條件:
sed '1,5!d' file.txt 刪除前5行之外的所有行
打印(p)
打印可視爲刪除的逆操作。但有一個不同,必須指明-n標誌,以免向輸出端重複打印。
sed -n '1,5p' file.txt 打印前5行
sed -n '/^:/p' file.txt 打印以冒號開頭的行
行的添加(a)、插入(i)、改變(c) //注意,改變的是整個新行
sed '/start/a/ ' file.txt 在包含start的行後插入一個空白行。
sed '$i/ ' file.txt 在文件的末尾插入一個空白行。
sed '/secret/c/DELETED' file.txt 查找單詞secret,然後把包含它的整行替換爲DELETED。
可以使用{}把多個指令編成一個指令組加以執行。
下面這段腳本 在匹配到關鍵字的行之前插入一個start行,之後播放一個sed行,然後把這一行本身替換成DELETED。
sed '/secret/{
i/
--start
a/
--end
c/
DELETED
}' file.txt
退出(q)
退出即結束sed編輯階段。
sed '10q' file.txt p 這個命令發送文件的前10行,完成第10行後,就結束sed編輯階段。
這個命令可以完成GNU/Linux 中head命令的功能。
輪換(y)
y指令可以轉換文本,可以把一個字符轉換爲另一個。要提供兩個字符集合,第一個是查找集合,第二個是替換集合。
例如下面示例,如果遇到A,就把它替換爲a,以此類推。這個示例把所有大寫字母轉換成小寫字母。
sed 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/' file.txt
進行轉換時,樣式和替換字符按照一一對應的關係進行處理,因些,這兩個字符串的長度必須相等。
行數(=)
=用於發送當前的行數。可用於發送匹配給定的查找字符串的行數,或是發送輸入文件的行數。
例如,如果想知道哪些行包含了指定的查找樣式 ,可用以下腳本:
sed -n '/This/=' file.txt 這個腳本 會發送包含單詞This的那些行的行數,即每行的行號。
保持樣式 空間(h)
在sed中,有很多空間(緩衝器),sed命令就在其中進行操作。每一輸入行都首先複製到樣式空間。樣式空間是由sed臨時擁有的空間,供sed命令執行。在對樣式 空間完成腳本所指定的工作後,這一行就會被 複製輸出。
在sed中還有保留空間,可以把樣式 空間中的內容 複製到保留空間,然後在晚些時候取回他們。保留空間只是一個臨時緩衝器,但在要記錄某些行進可能非常有用。
使用保留緩衝器,可以把樣式空間中的內容存儲到保留緩衝器中,然後直接對樣式緩衝器進行操作。下面這個示例演示了發送改變後的和未改變的行。
#表示對sed腳本 的註釋,#後的字符都會識別爲註釋。
sed '{
#store the pattern space to the hold buffer
h
#perform the substitution on the pattern space
s/is/IS/
# append the unaltered line to the pattern sapce
G
}' file.txt
這個腳本發送改變後的行,然後立即發送未改動的行。
一些有用的sed單行程序:
#Emit the first 10 lines of a file(such as 'head')
sed 10q file.txt
#Emit a double-spaced version of the file
sed 'G' file.txt
#Emit number of lines in input file
sed -n '$=' file.txt
#Emit the last line of a file
sed '$!d' file.txt
#Emit all lines greater than 30 characters in length
sed -n '/^./{30/}/p' file.txt
#Emit all non-blank lines
sed '/^$/d' file.txt
#Remove all blank lines at the top of a file
sed '/./,$!d' file.txt
附加:
從shell向sed傳值
要從命令行中向s e d傳值,值得注意的是用雙引號,否則功能不執行。REPLACE="GO"; sed "s/go/$REPLACE/g" quote.txt
下面是一些一行命令集。([ ]表示空格, [ ]表示t a b鍵)
‘s / \ . $ / / g’ 刪除以句點結尾行
‘s / [ ] [ ] [ ] * / [ ] / g’ 刪除一個以上空格,用一個空格代替
‘s / ^ [ ] [ ] * / / g’ 刪除行首空格
‘s / \ . [ ] [ ] * / [ ] / g’ 刪除句點後跟兩個或更多空格,代之以一個空格
‘/ ^ $ / d’ 刪除空行
‘s / ^ . / / g’ 刪除第一個字符
‘s /CO L \ ( . . . \ ) / / g’ 刪除緊跟C O L的後三個字母
‘s / ^ \ / / / g’ 從路徑中刪除第一個\
‘s / [ ] / [ ] / / g’ 刪除所有空格並用t a b鍵替代
‘S / ^ [ ] / / g’ 刪除行首所有t a b鍵
‘s / [ ] * / / g’ 刪除所有t a b鍵
在這個特別的規則表達式中,出現了 '[[:space:]]' 字符類。這只是一個特殊的關鍵字,它告訴 sed 與 TAB 或空格匹配。如果願意的話,可以不輸入 '[[:space:]]',而輸入 '[',然後是空格字母,然後是 Ctrl-V,然後再輸入製表鍵字母和 ']' -- Control-V 告訴 bash 要插入“真正”的製表鍵,而不是執行命令擴展。使用 '[[:space:]]' 命令類(特別是在腳本中)會更清楚。 solaris當然還是要用/usr/xpg4/bin/sed.
關於 's///' 命令的另一個妙處是 '/' 分隔符有許多替換選項。如果正在執行字符串替換,並且規則表達式或替換字符串中有許多斜槓,則可以通過在 's' 之後指定一個不同的字符來更改分隔符。sed -e 's:/usr/local:/usr:g' mylist.txt 在該例中,使用冒號作爲分隔符。
http://www.mscto.com
更多字符匹配
'[ ]' 規則表達式語法還有一些附加選項。要指定字符範圍,只要字符不在第一個或最後一個位置,就可以使用 '-',如下所示:
'[a-x]*'
這將匹配零或多個全部爲 'a'、'b'、'c'...'v'、'w'、'x' 的字符。另外,可以使用 '[:space:]' 字符類來匹配空格。以下是可用字符類的相當完整的列表:
字符類 描述
[:alnum:] 字母數字 [a-z A-Z 0-9]
[:alpha:] 字母 [a-z A-Z]
[:blank:] 空格或製表鍵
[:cntrl:] 任何控制字符
[:digit:] 數字 [0-9]
[:graph:] 任何可視字符(無空格)
[:lower:] 小寫 [a-z]
[:print:] 非控制字符
[:punct:] 標點字符
[:space:] 空格
[:upper:] 大寫 [A-Z]
[:xdigit:] 十六進制數字 [0-9 a-f A-F] http://www.mscto.com
有時,可能要指定應用到一個地址的多個命令。這在執行許多 's///' 以變換源文件中的字和語法時特別方便。要對一個地址執行多個命令,可在文件中輸入 sed 命令,然後使用 '{ }' 字符將這些命令分組,如下所示:1,/^END/{ s/[Ll]inux/GNU\/Linux/g s/samba/Samba/g s/posix/POSIX/g p }