- -------------------------------------------------------------------------
- SED单行脚本快速参考(Unix 流编辑器) 2005年12月29日
-
- 英文标题:USEFUL ONE-LINE SCRIPTS FOR SED (Unix stream editor)
- 原标题:HANDY ONE-LINERS FOR SED (Unix stream editor)
-
- 整理:Eric Pement - 电邮:pemente[at]northpark[dot]edu 版本5.5
- 译者:Joe Hong - 电邮:hq00e[at]126[dot]com
-
- 在以下地址可找到本文档的最新(英文)版本:
- http://sed.sourceforge.net/sed1line.txt
- http://www.pement.org/sed/sed1line.txt
-
- 其他语言版本:
- 中文 - http://sed.sourceforge.net/sed1line_zh-CN.html
- 捷克语 - http://sed.sourceforge.net/sed1line_cz.html
- 荷语 - http://sed.sourceforge.net/sed1line_nl.html
- 法语 - http://sed.sourceforge.net/sed1line_fr.html
- 德语 - http://sed.sourceforge.net/sed1line_de.html
-
- 葡语 - http://sed.sourceforge.net/sed1line_pt-BR.html
-
-
- 文本间隔:
- --------
-
-
- sed G
-
-
-
- sed '/^$/d;G'
-
-
- sed 'G;G'
-
-
- sed 'n;d'
-
-
- sed '/regex/{x;p;x;}'
-
-
- sed '/regex/G'
-
-
- sed '/regex/{x;p;x;G;}'
-
- 编号:
- --------
-
-
-
- sed = filename | sed 'N;s/\n/\t/'
-
-
- sed = filename | sed 'N; s/^/ /; s/ *\(.\{6,\}\)\n/\1 /'
-
-
- sed '/./=' filename | sed '/./N; s/\n/ /'
-
-
- sed -n '$='
-
- 文本转换和替代:
- --------
-
-
- sed 's/.$//'
- sed 's/^M$//'
- sed 's/\x0D$//'
-
-
- sed "s/$/`echo -e \\\r`/"
- sed 's/$'"/`echo \\\r`/"
- sed "s/$/`echo \\\r`/"
- sed 's/$/\r/'
-
-
- sed "s/$//"
- sed -n p
-
-
-
-
-
-
- sed "s/\r//" infile >outfile
- tr -d \r <infile >outfile
-
-
-
- sed 's/^[ \t]*//'
-
-
- sed 's/[ \t]*$//'
-
-
- sed 's/^[ \t]*//;s/[ \t]*$//'
-
-
- sed 's/^/ /'
-
-
- sed -e :a -e 's/^.\{1,78\}$/ &/;ta'
-
-
-
-
- sed -e :a -e 's/^.\{1,77\}$/ & /;ta'
- sed -e :a -e 's/^.\{1,77\}$/ &/;ta' -e 's/\( *\)\1/\1/'
-
-
- sed 's/foo/bar/'
- sed 's/foo/bar/4'
- sed 's/foo/bar/g'
- sed 's/\(.*\)foo\(.*foo\)/\1bar\2/'
- sed 's/\(.*\)foo/\1bar/'
-
-
- sed '/baz/s/foo/bar/g'
-
-
- sed '/baz/!s/foo/bar/g'
-
-
- sed 's/scarlet/red/g;s/ruby/red/g;s/puce/red/g'
- gsed 's/scarlet\|ruby\|puce/red/g'
-
-
-
- sed '1!G;h;$!d'
- sed -n '1!G;h;$p'
-
-
- sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'
-
-
- sed '$!N;s/\n/ /'
-
-
-
- sed -e :a -e '/\\$/N; s/\\\n//; ta'
-
-
-
- sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D'
-
-
- gsed ':a;s/\B[0-9]\{3\}\>/,&/;ta'
- sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta'
-
-
- gsed -r ':a;s/(^|[^0-9.])([0-9]+)([0-9]{3})/\1\2,\3/g;ta'
-
-
- gsed '0~5G'
- sed 'n;n;n;n;G;'
-
- 选择性地显示特定行:
- --------
-
-
- sed 10q
-
-
- sed q
-
-
- sed -e :a -e '$q;N;11,$D;ba'
-
-
- sed '$!N;$!D'
-
-
- sed '$!d'
- sed -n '$p'
-
-
- sed -e '$!{h;d;}' -e x
- sed -e '1{$q;}' -e '$!{h;d;}' -e x
- sed -e '1{$d;}' -e '$!{h;d;}' -e x
-
-
- sed -n '/regexp/p'
- sed '/regexp/!d'
-
-
- sed -n '/regexp/!p'
- sed '/regexp/d'
-
-
- sed -n '/regexp/{g;1!p;};h'
-
-
- sed -n '/regexp/{n;p;}'
-
-
-
- sed -n -e '/regexp/{=;x;1!p;g;$!N;p;D;}' -e h
-
-
- sed '/AAA/!d; /BBB/!d; /CCC/!d'
-
-
- sed '/AAA.*BBB.*CCC/!d'
-
-
- sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d
- gsed '/AAA\|BBB\|CCC/!d'
-
-
-
- sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;'
-
-
- sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;/BBB/!d;/CCC/!d'
-
-
- sed -e '/./{H;$!d;}' -e 'x;/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d
- gsed '/./{H;$!d;};x;/AAA\|BBB\|CCC/b;d'
-
-
- sed -n '/^.\{65\}/p'
-
-
- sed -n '/^.\{65\}/!p'
- sed '/^.\{65\}/d'
-
-
- sed -n '/regexp/,$p'
-
-
- sed -n '8,12p'
- sed '8,12!d'
-
-
- sed -n '52p'
- sed '52!d'
- sed '52q;d'
-
-
- gsed -n '3~7p'
- sed -n '3,${p;n;n;n;n;n;n;}'
-
-
- sed -n '/Iowa/,/Montana/p'
-
- 选择性地删除特定行:
- --------
-
-
- sed '/Iowa/,/Montana/d'
-
-
-
- sed '$!N; /^\(.*\)\n\1$/!P; D'
-
-
-
- sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P'
-
-
- sed '$!N; s/^\(.*\)\n\1$/\1/; t; D'
-
-
- sed '1,10d'
-
-
- sed '$d'
-
-
- sed 'N;$!P;$!D;$d'
-
-
- sed -e :a -e '$d;N;2,10ba' -e 'P;D'
- sed -n -e :a -e '1,10!{P;N;D;};N;ba'
-
-
- gsed '0~8d'
- sed 'n;n;n;n;n;n;n;d;'
-
-
- sed '/pattern/d'
-
-
-
- sed '/^$/d'
- sed '/./!d'
-
-
-
- sed '/./,/^$/!d'
- sed '/^$/N;/\n$/D'
-
-
- sed '/^$/N;/\n$/N;//D'
-
-
- sed '/./,$!d'
-
-
- sed -e :a -e '/^\n*$/{$d;N;ba' -e '}'
- sed -e :a -e '/^\n*$/N;/\n$/ba'
-
-
- sed -n '/^$/{p;h;};/./{x;/./p;}'
-
- 特殊应用:
- --------
-
-
-
- sed "s/.`echo \\\b`//g"
- sed 's/.^H//g'
- sed 's/.\x08//g'
-
-
- sed '/^$/q'
-
-
- sed '1,/^$/d'
-
-
- sed '/^Subject: */!d; s///;q'
-
-
- sed '/^Reply-To:/q; /^From:/h; /./d;g;q'
-
-
-
- sed 's/ *(.*)//; s/>.*//; s/.*[:<] *//'
-
-
- sed 's/^/> /'
-
-
- sed 's/^> //'
-
-
- sed -e :a -e 's/<[^>]*>//g;/</N;//ba'
-
-
-
-
-
- sed '/^end/,/^begin/d' file1 file2 ... fileX | uudecode
- sed '/^end/,/^begin/d' "$@" | uudecode
-
-
-
-
- sed '/./{H;d;};x;s/\n/={NL}=/g' file | sort | sed '1s/={NL}=//;s/={NL}=/\n/g'
- gsed '/./{H;d};x;y/\n/\v/' file | sort | sed '1s/\v//;y/\v/\n/'
-
-
-
-
- echo @echo off >zipup.bat
- dir /b *.txt | sed "s/^\(.*\)\.TXT/pkzip -mo \1 \1.TXT/" >>zipup.bat
-
-
- 使用SED:Sed接受一个或多个编辑命令,并且每读入一行后就依次应用这些命令。
- 当读入第一行输入后,sed对其应用所有的命令,然后将结果输出。接着再读入第二
- 行输入,对其应用所有的命令……并重复这个过程。上一个例子中sed由标准输入设
- 备(即命令解释器,通常是以管道输入的形式)获得输入。在命令行给出一个或多
- 个文件名作为参数时,这些文件取代标准输入设备成为sed的输入。sed的输出将被
- 送到标准输出(显示器)。因此:
-
- cat filename | sed '10q'
- sed '10q' filename
- sed '10q' filename > newfile
-
- 要了解sed命令的使用说明,包括如何通过脚本文件(而非从命令行)来使用这些命
- 令,请参阅《sed & awk》第二版,作者Dale Dougherty和Arnold Robbins
- (O'Reilly,1997;http://www.ora.com),《UNIX Text Processing》,作者
- Dale Dougherty和Tim O'Reilly(Hayden Books,1987)或者是Mike Arst写的教
- 程——压缩包的名称是“U-SEDIT2.ZIP”(在许多站点上都找得到)。要发掘sed
- 的潜力,则必须对“正则表达式”有足够的理解。正则表达式的资料可以看
- 《Mastering Regular Expressions》作者Jeffrey Friedl(O'reilly 1997)。
- Unix系统所提供的手册页(“man”)也会有所帮助(试一下这些命令
- “man sed”、“man regexp”,或者看“man ed”中关于正则表达式的部分),但
- 手册提供的信息比较“抽象”——这也是它一直为人所诟病的。不过,它本来就不
- 是用来教初学者如何使用sed或正则表达式的教材,而只是为那些熟悉这些工具的人
- 提供的一些文本参考。
-
- 括号语法:前面的例子对sed命令基本上都使用单引号('...')而非双引号
- ("...")这是因为sed通常是在Unix平台上使用。单引号下,Unix的shell(命令
- 解释器)不会对美元符($)和后引号(`...`)进行解释和执行。而在双引号下
- 美元符会被展开为变量或参数的值,后引号中的命令被执行并以输出的结果代替
- 后引号中的内容。而在“csh”及其衍生的shell中使用感叹号(!)时需要在其前
- 面加上转义用的反斜杠(就像这样:\!)以保证上面所使用的例子能正常运行
- (包括使用单引号的情况下)。DOS版本的Sed则一律使用双引号("...")而不是
- 引号来圈起命令。
-
- '\t'的用法:为了使本文保持行文简洁,我们在脚本中使用'\t'来表示一个制表
- 符。但是现在大部分版本的sed还不能识别'\t'的简写方式,因此当在命令行中为
- 脚本输入制表符时,你应该直接按TAB键来输入制表符而不是输入'\t'。下列的工
- 具软件都支持'\t'做为一个正则表达式的字元来表示制表符:awk、perl、HHsed、
- sedmod以及GNU sed v3.02.80。
-
- 不同版本的SED:不同的版本间的sed会有些不同之处,可以想象它们之间在语法上
- 会有差异。具体而言,它们中大部分不支持在编辑命令中间使用标签(:name)或分
- 支命令(b,t),除非是放在那些的末尾。这篇文档中我们尽量选用了可移植性较高
- 的语法,以使大多数版本的sed的用户都能使用这些脚本。不过GNU版本的sed允许使
- 用更简洁的语法。想像一下当读者看到一个很长的命令时的心情:
-
- sed -e '/AAA/b' -e '/BBB/b' -e '/CCC/b' -e d
-
- 好消息是GNU sed能让命令更紧凑:
-
- sed '/AAA/b;/BBB/b;/CCC/b;d'
- sed '/AAA\|BBB\|CCC/b;d'
-
- 此外,请注意虽然许多版本的sed接受象“/one/ s/RE1/RE2/”这种在's'前带有空
- 格的命令,但这些版本中有些却不接受这样的命令:“/one/! s/RE1/RE2/”。这时
- 只需要把中间的空格去掉就行了。
-
- 速度优化:当由于某种原因(比如输入文件较大、处理器或硬盘较慢等)需要提高
- 命令执行速度时,可以考虑在替换命令(“s/.../.../”)前面加上地址表达式来
- 提高速度。举例来说:
-
- sed 's/foo/bar/g' filename
- sed '/foo/ s/foo/bar/g' filename
- sed '/foo/ s//bar/g' filename
-
- 当只需要显示文件的前面的部分或需要删除后面的内容时,可以在脚本中使用“q”
- 命令(退出命令)。在处理大的文件时,这会节省大量时间。因此:
-
- sed -n '45,50p' filename
- sed -n '51q;45,50p' filename
-
- 如果你有其他的单行脚本想与大家分享或者你发现了本文档中错误的地方,请发电
- 子邮件给本文档的作者(Eric Pement)。邮件中请记得提供你所使用的sed版本、
- 该sed所运行的操作系统及对问题的适当描述。本文所指的单行脚本指命令行的长
- 度在65个字符或65个以下的sed脚本〔译注1〕。本文档的各种脚本是由以下所列作
- 者所写或提供:
-
- Al Aab
- Edgar Allen
- Yiorgos Adamopoulos
- Dale Dougherty
- Carlos Duarte
- Eric Pement
- Ken Pizzini
- S.G. Ravenhall
- Greg Ubben
- -------------------------------------------------------------------------
-
- 译注1:大部分情况下,sed脚本无论多长都能写成单行的形式(通过`-e'选项和`;'
- 号)——只要命令解释器支持,所以这里说的单行脚本除了能写成一行还对长度有
- 所限制。因为这些单行脚本的意义不在于它们是以单行的形式出现。而是让用户能
- 方便地在命令行中使用这些紧凑的脚本才是其意义所在。