將原來的所有空行刪除并在每一行后面增加一空行。 這樣在輸出的文本中每一行后面將有且只有一空行。>>> sed '/^$/d;G'
在每一行后面增加兩行空行>>> sed 'G;G'
將第一個腳本所產生的所有空行刪除(即刪除所有偶數行)>>> sed 'n;d'
在匹配式樣“regex”的行之前插入一空行>>> sed '/regex/{x;p;x;}'
在匹配式樣“regex”的行之后插入一空行>>> sed '/regex/G'
在匹配樣式“regex”的行之前和之后各插入一空行>>> sed '/regex/{x;p;x;G}'
二. 編號
為文件中的每一行進行(簡單的左對齊方式)。這里使用了“制表符” (tab, 見本文末尾關于’t'的用法的描述)而不是空格來對齊邊緣。>>> sed = filename | sed 'N;s/\n/\t/'
對文件中的所有行編號(行號在左,文字右端對齊)>>> sed 'N; s/^/ /; s/ \*\(.\{6,\}\)\n/\1 /'
對文件中的所有行號編號,但只顯示非空白行的行號>>> sed '/./=' filename | sed '/./N; s/\n/ /'
計算行數(模擬“wc -l”)>>> sed -n '$='
三、文件轉換和替代
Unix環境:轉換DOS的換行符(CR/LF)為Unix格式>>> sed 's/.$//' # 假設所有行以CR/LF結束>>> sed 's/^M$//' # 在bash/tcsh中,將按Ctrl-M改為按Ctrl-V>>> sed 's/\x0D$//' # ssed、gsed 3.02.80,及更高版本
Unix環境:轉換Unix的新行符(LF)為DOS格式。>>> sed "s/$/`echo -e \\\r`/" # 在ksh下所使用的命令>>> sed 's/
"/`echo \\\r`/" # 在bash下所使用的命令>>> sed "s/$/`echo \\\r`/" # 在zsh下所使用的命令>>> sed 's/$/\r/' # gsed 3.02.80 及更高版本DOS環境:轉換Unix新行符(LF)為DOS格式。>>> sed "s/$//" # 方法 1>>> sed -n p # 方法 2DOS環境:轉換DOS新行符(CR/LF)為Unix格式。 下面的腳本只對UnxUtils sed 4.0.7 及更高版本有效。要識別UnxUtils版本的 sed可以通過其特有的“–text”選項。你可以使用幫助選項(“–help”)看 其中有無一個“–text”項以此來判斷所使用的是否是UnxUtils版本。其它DOS 版本的的sed則無法進行這一轉換。但可以用“tr”來實現這一轉換。>>> sed "s/\r//" infile >outfile # UnxUtils sed v4.0.7 或更高版本>>> tr -d \r <infile >outfile # GNU tr 1.22 或更高版本將每一行前導的“空白字符”(空格,制表符)刪除 使之左對齊>>> sed 's/^[ \t]*//' # 見本文末尾關于'\t'用法的描述將每一行拖尾的“空白字符”(空格,制表符)刪除>>> sed 's/[ \t]*$//' # 見本文末尾關于'\t'用法的描述將每一行中的前導和拖尾的空白字符刪除>>> sed 's/^[ \t]*//;s/[ \t]*$//'在每一行開頭處插入5個空格(使全文向右移動5個字符的位置)>>> sed 's/^/ /'以79個字符為寬度,將所有文本右對齊>>> sed -e :a -e 's/^.\{1,78\}$/ &/;ta' # 78個字符外加最后的一個空格以79個字符為寬度,使所有文本居中。在方法1中,為了讓文本居中每一行的前 頭和后頭都填充了空格。 在方法2中,在居中文本的過程中只在文本的前面填充 空格,并且最終這些空格將有一半會被刪除。此外每一行的后頭并未填充空格。>>> sed -e :a -e 's/^.\{1,77\}$/ & /;ta' # 方法1>>> sed -e :a -e 's/^.\{1,77\}$/ &/;ta' -e 's/\( \*\)\1/\1/' # 方法2在每一行中查找字串“foo”,并將找到的“foo”替換為“bar”>>> sed 's/foo/bar/' # 只替換每一行中的第一個“foo”字串>>> sed 's/foo/bar/4' # 只替換每一行中的第四個“foo”字串>>> sed 's/foo/bar/g' # 將每一行中的所有“foo”都換成“bar”>>> sed 's/\(.*\)foo\(.*foo\)/\1bar\2/' # 替換倒數第二個“foo”>>> sed 's/\(.*\)foo/\1bar/' # 替換最后一個“foo”只在行中出現字串“baz”的情況下將“foo”替換成“bar”>>> sed '/baz/s/foo/bar/g'將“foo”替換成“bar”,并且只在行中未出現字串“baz”的情況下替換>>> sed '/baz/!s/foo/bar/g'不管是“scarlet”“ruby”還是“puce”,一律換成“red”>>> sed 's/scarlet/red/g;s/ruby/red/g;s/puce/red/g' #對多數的sed都有效>>> gsed 's/scarlet\|ruby\|puce/red/g' # 只對GNU sed有效倒置所有行,第一行成為最后一行,依次類推(模擬“tac”)。 由于某些原因,使用下面命令時HHsed v1.5會將文件中的空行刪除>>> sed '1!G;h;$!d' # 方法1>>> sed -n '1!G;h;$p' # 方法2將行中的字符逆序排列,第一個字成為最后一字,……(模擬“rev”)>>> sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'將每兩行連接成一行(類似“paste”)>>> sed '$!N;s/\n/ /'如果當前行以反斜杠“”結束,則將下一行并到當前行末尾 并去掉原來行尾的反斜杠>>> sed -e :a -e '/\\$/N; s/\\\n//; ta'如果當前行以等號開頭,將當前行并到上一行末尾 并以單個空格代替原來行頭的“=”>>> sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D'為數字字串增加逗號分隔符號,將“1234567”改為“1,234,567”>>> gsed ':a;s/\B[0-9]\{3\}\>/,&/;ta' # GNU sed>>> sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta' # 其他sed為帶有小數點和負號的數值增加逗號分隔符(GNU sed)>>> gsed -r ':a;s/(^|[^0-9.])([0-9]+)([0-9]{3})/\1\2,\3/g;ta'在每5行后增加一空白行 (在第5,10,15,20,等行后增加一空白行)>>> gsed '0~5G' # 只對GNU sed有效>>> sed 'n;n;n;n;G;' # 其他sed
四、選擇性地顯示特定行
顯示文件中的前10行 (模擬“head”的行為)>>> sed 10q
顯示文件中的第一行 (模擬“head -1”命令)>>> sed q
顯示文件中的最后10行 (模擬“tail”)>>> sed -e :a -e '$q;N;11,$D;ba'
顯示文件中的最后2行(模擬“tail -2”命令)>>> sed '$!N;$!D'
顯示文件中的最后一行(模擬“tail -1”)>>> sed '$!d' # 方法1>>> sed -n '$p' # 方法2
顯示文件中的倒數第二行>>> sed -e '$!{h;d;}' -e x # 當文件中只有一行時,輸入空行>>> sed -e '1{$q;}' -e '$!{h;d;}' -e x # 當文件中只有一行時,顯示該行>>> sed -e '1{$d;}' -e '$!{h;d;}' -e x # 當文件中只有一行時,不輸出
只顯示匹配正則表達式的行(模擬“grep”)>>> sed -n '/regexp/p' # 方法1>>> sed '/regexp/!d' # 方法2
只顯示“不”匹配正則表達式的行(模擬“grep -v”)>>> sed -n '/regexp/!p' # 方法1,與前面的命令相對應>>> sed '/regexp/d' # 方法2,類似的語法
查找“regexp”并將匹配行的上一行顯示出來,但并不顯示匹配行>>> sed -n '/regexp/{g;1!p;};h'
查找“regexp”并將匹配行的下一行顯示出來,但并不顯示匹配行>>> sed -n '/regexp/{n;p;}'
顯示包含“regexp”的行及其前后行,并在第一行之前加上“regexp”所 在行的行號 (類似“grep -A1 -B1”)>>> sed -n -e '/regexp/{=;x;1!p;g;$!N;p;D;}' -e h
顯示包含“AAA”、“BBB”或“CCC”的行(任意次序)>>> sed '/AAA/!d; /BBB/!d; /CCC/!d' # 字串的次序不影響結果
顯示包含“AAA”、“BBB”和“CCC”的行(固定次序)>>> sed '/AAA.*BBB.*CCC/!d'
顯示包含“AAA”“BBB”或“CCC”的行 (模擬“egrep”)>>> sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d # 多數sed>>> gsed '/AAA\|BBB\|CCC/!d' # 對GNU sed有效
顯示包含“AAA”的段落 (段落間以空行分隔) HHsed v1.5 必須在“x;”后加入“G;”,接下來的3個腳本都是這樣>>> sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;'
顯示包含“AAA”“BBB”和“CCC”三個字串的段落 (任意次序)>>> sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;/BBB/!d;/CCC/!d'