>

流编辑器,命令的局地用法

- 编辑:www.bifa688.com -

流编辑器,命令的局地用法

英文标题:USEFUL ONE-LINE SCPRADOIPTS FO奥迪Q7 SED (Unix stream editor)
原标题:HANDY ONE-LINERS FOR SED (Unix stream editor)

sed(文件)命令的某些用法

SED单行脚本火速参谋(Unix 流编辑器)

整理:Eric Pement - 电邮:pemente[at]northpark[dot]edu 版本5.5
译者:Joe Hong - 电邮:hq00e[at]126[dot]com

 

英文标题:USEFUL ONE-LINE SCRIPTS FO奇骏 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

任何语言版本:
中文 -
捷克语 -
荷语 -
法语 -
德语 -


在以下地方可找到本文书档案的新型(英文)版本:

葡语 -

 # 在每一行前边扩充1空行

别的语言版本:
中文 -
捷克语 -
荷语 -
法语 -
德语 -

文本间隔:

# 在每壹行前面扩大壹空行
sed G

# 将原先的有所空行删除并在每一行前面扩张一空行。
# 那样在出口的文件中每1行前面将有且只有1空行。
sed '/^$/d;G'

# 在每一行后边扩大两行空行
sed 'G;G'

# 将首先个脚本所发生的具有空行删除(即除去全数偶数行)
sed 'n;d'

# 在相配式样“regex”的行在此之前安顿1空行
sed '/regex/{x;p;x;}'

# 在相称式样“regex”的行之后插入一空行
sed '/regex/G'

# 在相配式样“regex”的行此前和后来各插入一空行
sed '/regex/{x;p;x;G;}'

 sed G

葡语 -

编号:

# 为文件中的每一行开始展览编号(轻松的左对齐格局)。这里运用了“制表符”
# (tab,见本文末尾关于't'的用法的叙说)而不是空格来对齐边缘。
sed = filename | sed 'N;s/n/t/'

# 对文件中的全部行编号(行号在左,文字右端对齐)。
sed = filename | sed 'N; s/^/ /; s/ *(.{6,})n/1 /'

# 对文本中的全体行编号,但只显示非空白行的行号。
sed '/./=' filename | sed '/./N; s/n/ /'

# 总括行数 (模拟 "wc -l")
sed -n '$='

 # 将本来的保有空行删除并在每1行前边扩大壹空行。

文本间隔:

# 在每一行后边扩充壹空行
sed G

# 将本来的有着空行删除并在每壹行前面扩充一空行。
# 那样在输出的文件中每壹行后边将有且只有壹空行。
sed '/^$/d;G'

# 在每1行前面增添两行空行
sed 'G;G'

# 将率先个脚本所发生的持有空行删除(即除去全部偶数行)
sed 'n;d'

# 在匹配式样“regex”的行此前布署一空行
sed '/regex/{x;p;x;}'

# 在相称式样“regex”的行之后插入壹空行
sed '/regex/G'

# 在相配式样“regex”的行在此以前和现在各插入1空行
sed '/regex/{x;p;x;G;}'

文件调换和替代:

# Unix情况:调换DOS的新行符(C本田CR-V/LF)为Unix格式。
sed 's/.$//' # 要是全体行以C揽胜/LF甘休
sed 's/^M$//' # 在bash/tcsh中,将按Ctrl-M改为按Ctrl-V
sed 's/x0D$//' # ssed、gsed 3.0二.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 三.0贰.80 及越来越高版本

# DOS环境:转换Unix新行符(LF)为DOS格式。
sed "s/$//" # 方法 1
sed -n p # 方法 2

# DOS环境:转换DOS新行符(CR/LF)为Unix格式。
# 上面包车型客车本子只对UnxUtils sed 四.0.7及更加高版本有效。要识别UnxUtils版本的
# sed能够由此其有意的“--text”选项。你能够运用支持采取(“--help”)看
# 在那之中有无1个“--text”项以此来判定所选用的是还是不是是UnxUtils版本。别的DOS
# 版本的的sed则不可能进行那壹更改。但足以用“tr”来促成那1转换。
sed "s/r//" infile >outfile # UnxUtils sed v肆.0.柒 或越来越高版本
tr -d r <infile >outfile # GNU tr 一.2二 或更加高版本

# 将每壹行前导的“空白字符”(空格,制表符)删除
# 使之左对齐
sed 's/^[ t]*//' # 见本文末尾关于't'用法的描述

# 将每1行拖尾的“空白字符”(空格,制表符)删除
sed 's/[ t]*$//' # 见本文末尾关于't'用法的叙说

# 将每1行中的前导和拖尾的空白字符删除
sed 's/^[ t]*//;s/[ t]*$//'

# 在每1行开始处插入四个空格(使全文向右移动几个字符的职位)
sed 's/^/ /'

# 以7陆个字符为宽度,将具备文件右对齐
sed -e :a -e 's/^.{1,78}$/ &/;ta' # 七10四个字符外加最后的一个空格

# 以77个字符为宽度,使具备文本居中。在点子第11中学,为了让文本居中每1行的前
# 头和后边都填充了空格。 在情势第22中学,在居汉语本的进程中只在文件的前边填充
# 空格,并且最终这个空格将有二分之一会被去除。其它每壹行的前面并未有填充空格。
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/' # 只替换每1行中的第三个“foo”字串
sed 's/foo/bar/4' # 只替换每壹行中的第6个“foo”字串
sed 's/foo/bar/g' # 将每壹行中的全体“foo”都换来“bar”
sed 's/(.*)foo(.*foo)/1bar2/' # 替换倒数第叁个“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”,1律换来“red”
sed 's/scarlet/red/g;s/ruby/red/g;s/puce/red/g' #对大部分的sed都有效
gsed 's/scarlet|ruby|puce/red/g' # 只对GNU sed有效

# 倒置全体行,第三行成为最终1行,依次类推(模拟“tac”)。
# 由于一些原因,使用上面发号施令时HHsed v一.5会将文件中的空行删除
sed '1!G;h;$!d' # 方法1
sed -n '1!G;h;$p' # 方法2

# 将行中的字符逆序排列,第1个字成为最终一字,……(模拟“rev”)
sed '/n/!G;s/(.)(.*n)/&21/;//D;s/.//'

# 将每两行连接成一行(类似“paste”)
sed '$!N;s/n/ /'

# 假诺当前行以反斜杠“”停止,则将下一行并到当前行末尾
# 并去掉原来行尾的反斜杠
sed -e :a -e '/\$/N; s/\n//; ta'

# 若是当前行以等号开端,将日前行并到上1行末尾
# 并以单个空格取代本来行头的“=”
sed -e :a -e '$!N;s/n=/ /;ta' -e 'P;D'

# 为数字字串扩张逗号分隔符号,将“123456七”改为“一,23四,5六七”
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})/12,3/g;ta'

# 在每五行后扩展1空白行 (在第陆,拾,一5,20,等行后扩大一空白行)
gsed '0~5G' # 只对GNU sed有效
sed 'n;n;n;n;G;' # 其他sed

 # 那样在输出的文件中每1行前边将有且唯有一空行。

编号:

# 为文件中的每1行进行编号(简单的左对齐格局)。这里运用了“制表符”
# (tab,见本文末尾关于't'的用法的讲述)而不是空格来对齐边缘。
sed = filename | sed 'N;s/n/t/'

# 对文本中的全部行编号(行号在左,文字右端对齐)。
sed = filename | sed 'N; s/^/ /; s/ *(.{6,})n/1 /'

# 对文件中的全部行编号,但只呈现非空白行的行号。
sed '/./=' filename | sed '/./N; s/n/ /'

# 总计行数 (模拟 "wc -l")
sed -n '$='

接纳性地出示特定行:

# 展现文件中的前十行 (模拟“head”的一言一动)
sed 10q

# 展现文件中的第一行 (模拟“head -一”命令)
sed q

# 展现文件中的最终十行 (模拟“tail”)
sed -e :a -e '$q;N;11,$D;ba'

# 显示文件中的最终2行(模拟“tail -2”命令)
sed '$!N;$!D'

# 突显文件中的最终1行(模拟“tail -1”)
sed '$!d' # 方法1
sed -n '$p' # 方法2

# 显示文件中的最后多少个第一行
sed -e '$!{h;d;}' -e x # 当文件中唯有1行时,输入空行
sed -e '1{$q;}' -e '$!{h;d;}' -e x # 当文件中唯有一行时,展现该行
sed -e '1{$d;}' -e '$!{h;d;}' -e x # 当文件中只有1行时,不出口

# 只展现相称正则表达式的行(模拟“grep”)
sed -n '/regexp/p' # 方法1
sed '/regexp/!d' # 方法2

# 只呈现“不”相称正则表达式的行(模拟“grep -v”)
sed -n '/regexp/!p' # 方法一,与前方的一声令下相对应
sed '/regexp/d' # 方法二,类似的语法

# 查找“regexp”并将相配行的上壹行呈现出来,但并不显得相配行
sed -n '/regexp/{g;1!p;};h'

# 查找“regexp”并将匹配行的下一行呈现出来,但并不显得相称行
sed -n '/regexp/{n;p;}'

# 显示包涵“regexp”的行及其前后行,并在第三行此前拉长“regexp”所
# 在行的行号 (类似“grep -A一 -B一”)
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 v一.五 必须在“x;”后进入“G;”,接下去的二个剧本都以如此
sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;'

# 突显包括“AAA”“BBB”和“CCC”多少个字串的段落 (放肆次序)
sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;/BBB/!d;/CCC/!d'

# 呈现包涵“AAA”、“BBB”、“CCC”三者中任一字串的段落 (任性次序)
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' # 只对GNU sed有效

# 展现包蕴陆16个或上述字符的行
sed -n '/^.{65}/p'

# 展现包罗七十多个以下字符的行
sed -n '/^.{65}/!p' # 方法一,与地方的台本相呼应
sed '/^.{65}/d' # 方法2,更简便一点的主意

# 展现部分文件——从包涵正则表明式的行早先到终极一行终止
sed -n '/regexp/,$p'

# 显示部分文件——钦赐行号范围(从第9至第32行,含八和1二行)
sed -n '8,12p' # 方法1
sed '8,12!d' # 方法2

# 显示第52行
sed -n '52p' # 方法1
sed '52!d' # 方法2
sed '52q;d' # 方法三, 管理大文件时更有作用

# 从第二行开端,每7行显示一回
gsed -n '3~7p' # 只对GNU sed有效
sed -n '3,${p;n;n;n;n;n;n;}' # 其他sed

# 显示八个正则表明式之间的文件(包括)
sed -n '/Iowa/,/Montana/p' # 区分轻重缓急写方式

 sed '/^$/d;G'

文件调换和代表:

# Unix境况:转变DOS的新行符(C奥迪Q7/LF)为Unix格式。
sed 's/.$//' # 假如全部行以CLAND/LF甘休
sed 's/^M$//' # 在bash/tcsh中,将按Ctrl-M改为按Ctrl-V
sed 's/x0D$//' # ssed、gsed 叁.0二.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 三.0二.80 及更加高版本

# DOS环境:转换Unix新行符(LF)为DOS格式。
sed "s/$//" # 方法 1
sed -n p # 方法 2

# DOS环境:转换DOS新行符(CR/LF)为Unix格式。
# 上边包车型大巴台本只对UnxUtils sed 四.0.7及更加高版本有效。要识别UnxUtils版本的
# sed能够经过其有意的“--text”选项。你可以动用帮助选拔(“--help”)看
# 当中有无三个“--text”项以此来判别所利用的是或不是是UnxUtils版本。别的DOS
# 版本的的sed则无从开始展览那1转变。但能够用“tr”来兑现那一转移。
sed "s/r//" infile >outfile # UnxUtils sed v四.0.7 或更加高版本
tr -d r <infile >outfile # GNU tr 一.2二 或更加高版本

# 将每一行前导的“空白字符”(空格,制表符)删除
# 使之左对齐
sed 's/^[ t]*//' # 见本文末尾关于't'用法的叙述

# 将每壹行拖尾的“空白字符”(空格,制表符)删除
sed 's/[ t]*$//' # 见本文末尾关于't'用法的描述

# 将每一行中的前导和拖尾的空白字符删除
sed 's/^[ t]*//;s/[ t]*$//'

# 在每壹行早先处插入四个空格(使全文向右移动陆个字符的岗位)
sed 's/^/ /'

# 以77个字符为宽度,将全部文件右对齐
sed -e :a -e 's/^.{1,78}$/ &/;ta' # 八十一个字符外加最终的三个空格

# 以7十几个字符为宽度,使全体文本居中。在措施1中,为了让文本居中每一行的前
# 头和前边都填充了空格。 在措施2中,在居中文本的经过中只在文书的前边填充
# 空格,并且最终那一个空格将有八分之四会被去除。此外每1行的末尾并未填充空格。
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/' # 只替换每1行中的第3个“foo”字串
sed 's/foo/bar/4' # 只替换每一行中的第多个“foo”字串
sed 's/foo/bar/g' # 将每壹行中的全数“foo”都换来“bar”
sed 's/(.*)foo(.*foo)/1bar2/' # 替换尾数第二个“foo”
sed 's/(.*)foo/1bar/' # 替换最终2个“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有效

# 倒置全数行,第一行成为终极1行,依次类推(模拟“tac”)。
# 由于一些原因,使用上边发号施令时HHsed v一.5会将文件中的空行删除
sed '1!G;h;$!d' # 方法1
sed -n '1!G;h;$p' # 方法2

# 将行中的字符逆序排列,第二个字改成终极一字,……(模拟“rev”)
sed '/n/!G;s/(.)(.*n)/&21/;//D;s/.//'

# 将每两行连接成1行(类似“paste”)
sed '$!N;s/n/ /'

# 假若当前行以反斜杠“”结束,则将下壹行并到当前行末尾
# 并去掉原来行尾的反斜杠
sed -e :a -e '/\$/N; s/\n//; ta'

# 若是当前行以等号开始,将最近行并到上1行末尾
# 并以单个空格替代原先行头的“=”
sed -e :a -e '$!N;s/n=/ /;ta' -e 'P;D'

# 为数字字串扩展逗号分隔符号,将“1234567”改为“壹,234,5陆七”
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})/12,3/g;ta'

# 在每5行后扩大1空白行 (在第四,拾,15,20,等行后扩张一空白行)
gsed '0~5G' # 只对GNU sed有效
sed 'n;n;n;n;G;' # 其他sed

选择性地删除特定行:

# 突显通篇文书档案,除了五个正则表明式之间的剧情
sed '/Iowa/,/Montana/d'

# 删除文件中相邻的双重行(模拟“uniq”)
# 只保留重复行中的第贰行,其余行删除
sed '$!N; /^(.*)n1$/!P; D'

# 删除文件中的重复行,不管有无相邻。注意hold space所能帮忙的缓存
# 大小,只怕采用GNU sed。
sed -n 'G; s/n/&&/; /^([ -~]*n).*n1/d; s/n//; h; P'

# 删除除重复行外的具备行(模拟“uniq -d”)
sed '$!N; s/^(.*)n1$/1/; t; D'

# 删除文件中起首的十行
sed '1,10d'

# 删除文件中的最终一行
sed '$d'

# 删除文件中的最终两行
sed 'N;$!P;$!D;$d'

# 删除文件中的最终拾行
sed -e :a -e '$d;N;2,10ba' -e 'P;D' # 方法1
sed -n -e :a -e '1,10!{P;N;D;};N;ba' # 方法2

# 删除八的倍数行
gsed '0~8d' # 只对GNU sed有效
sed 'n;n;n;n;n;n;n;d;' # 其他sed

# 删除匹配式样的行
sed '/pattern/d' # 删除含pattern的行。当然pattern
# 可以换成别的有效的正则表达式

# 删除文件中的全数空行(与“grep '.' ”效果同样)
sed '/^$/d' # 方法1
sed '/./!d' # 方法2

# 只保留四个相邻空行的首先行。并且删除文件最上端和尾巴的空行。
# (模拟“cat -s”)
sed '/./,/^$/!d' #方法壹,删除文件最上端的空行,允许尾巴部分保留一空行
sed '/^$/N;/n$/D' #方法二,允许顶上部分保存1空行,尾部不留空行

# 只保留多少个相邻空行的前两行。
sed '/^$/N;/n$/N;//D'

# 删除文件顶端的有着空行
sed '/./,$!d'

# 删除文件尾巴部分的兼具空行
sed -e :a -e '/^n*$/{$d;N;ba' -e '}' # 对所有sed有效
sed -e :a -e '/^n*$/N;/n$/ba' # 同上,但只对 gsed 3.02.*有效

# 删除每一个段落的终极一行
sed -n '/^$/{p;h;};/./{x;/./p;}'

 # 在每一行前面扩张两行空行

选取性地显示特定行:

# 展现文件中的前十行 (模拟“head”的表现)
sed 10q

# 显示文件中的第三行 (模拟“head -一”命令)
sed q

# 展现文件中的最终10行 (模拟“tail”)
sed -e :a -e '$q;N;11,$D;ba'

# 显示文件中的最后二行(模拟“tail -贰”命令)
sed '$!N;$!D'

# 展现文件中的最终一行(模拟“tail -一”)
sed '$!d' # 方法1
sed -n '$p' # 方法2

# 展现文件中的倒数第一行
sed -e '$!{h;d;}' -e x # 当文件中唯有1行时,输入空行
sed -e '1{$q;}' -e '$!{h;d;}' -e x # 当文件中唯有1行时,彰显该行
sed -e '1{$d;}' -e '$!{h;d;}' -e x # 当文件中只有1行时,不出口

# 只展现相称正则表明式的行(模拟“grep”)
sed -n '/regexp/p' # 方法1
sed '/regexp/!d' # 方法2

# 只展现“不”相配正则表达式的行(模拟“grep -v”)
sed -n '/regexp/!p' # 方法一,与日前的吩咐绝对应
sed '/regexp/d' # 方法二,类似的语法

# 查找“regexp”并将相称行的上一行呈现出来,但并不出示相配行
sed -n '/regexp/{g;1!p;};h'

# 查找“regexp”并将相配行的下一行显示出来,但并不展现相称行
sed -n '/regexp/{n;p;}'

# 展现包涵“regexp”的行及其前后行,并在首先行以前增加“regexp”所
# 在行的行号 (类似“grep -A一 -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 v一.5 必须在“x;”后插足“G;”,接下去的一个剧本都以如此
sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;'

# 显示包含“AAA”“BBB”和“CCC”八个字串的段落 (任性次序)
sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;/BBB/!d;/CCC/!d'

# 展现包蕴“AAA”、“BBB”、“CCC”三者中任一字串的段落 (大肆次序)
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' # 只对GNU sed有效

# 展现包罗陆四个或上述字符的行
sed -n '/^.{65}/p'

# 展现包罗6四个以下字符的行
sed -n '/^.{65}/!p' # 方法壹,与地点的台本相呼应
sed '/^.{65}/d' # 方法贰,更省心一点的办法

# 突显部分文件——从包括正则表达式的行早先到终极1行终止
sed -n '/regexp/,$p'

# 展现部分文件——钦命行号范围(从第柒至第二二行,含八和1二行)
sed -n '8,12p' # 方法1
sed '8,12!d' # 方法2

# 显示第52行
sed -n '52p' # 方法1
sed '52!d' # 方法2
sed '52q;d' # 方法三, 处理大文件时更有功用

# 从第一行发轫,每7行突显三回
gsed -n '3~7p' # 只对GNU sed有效
sed -n '3,${p;n;n;n;n;n;n;}' # 其他sed

# 显示八个正则表明式之间的公文(包含)
sed -n '/Iowa/,/Montana/p' # 区分轻重缓急写格局

破例应用:

# 移除手册页(man page)中的nroff标志。在Unix System V或bash shell下使
# 用'echo'命令时大概供给足够 -e 选项。
sed "s/.`echo \b`//g" # 外层的双括号是必须的(Unix景况)
sed 's/.^H//g' # 在bash或tcsh中, 按 Ctrl-V 再按 Ctrl-H
sed 's/.x08//g' # sed 1.5,GNU sed,ssed所采纳的十陆进制的象征方法

# 提取新闻组或 e-mail 的邮件头
sed '/^$/q' # 删除第叁行空行后的持有剧情

# 提取音讯组或 e-mail 的正文部分
sed '1,/^$/d' # 删除第贰行空行在此之前的具备内容

# 从邮件头提取“Subject”(标题栏字段),并移除起首的“Subject:”字样
sed '/^Subject: */!d; s///;q'

# 从邮件头拿走回复地址
sed '/^Reply-To:/q; /^From:/h; /./d;g;q'

# 获取邮件地址。在上1个本子所产生的那1行邮件头的底子上更是的将非电邮
# 地址的一部分剃除。(见上一脚本)
sed 's/ *(.*)//; s/>.*//; s/.*[:<] *//'

# 在每壹行初步加上2个尖括号和空格(引用消息)
sed 's/^/> /'

# 将每1行初始处的尖括号和空格删除(解除引用)
sed 's/^> //'

# 移除大多数的HTML标签(包含跨行标签)
sed -e :a -e 's/<[^>]*>//g;/</N;//ba'

# 将分为多卷的uuencode文件解码。移除文件头消息,只保留uuencode编码部分。
# 文件必须以一定顺序传给sed。下边第一种版本的脚本可以直接在命令行下输入;
# 第二种版本则能够放入一个带实施权限的shell脚本中。(由Rahul Dhesi的1
# 个脚本修改而来。)
sed '/^end/,/^begin/d' file1 file2 ... fileX | uudecode # vers. 1
sed '/^end/,/^begin/d' "$@" | uudecode # vers. 2

# 将文件中的段落以字母顺序排序。段落间以(一行或多行)空行分隔。GNU sed使用
# 字元“v”来表示垂直制表符,这里用它来作为换行符的占位符——当然你也能够
# 用其余未在文件中使用的字符来取代他。
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/'

# 分别裁减每一种.TXT文件,压缩后去除原来的文件并将缩减后的.ZIP文件
# 命名字为与原本同样的名字(只是扩张名分歧)。(DOS境况:“dir /b”
# 突显不带路线的公文名)。
echo @echo off >zipup.bat
dir /b *.txt | sed "s/^(.*).TXT/pkzip -mo 1 1.TXT/" >>zipup.bat

动用SED:Sed接受一个或四个编辑命令,并且每读入一行后就相继使用那么些命令。
当读入第贰行输入后,sed对其应用具备的吩咐,然后将结果输出。接着再读入第二
行输入,对其使用具有的通令……并再次那一个进度。上三个例子中sed由规范输入设
备(即命令解释器,通常是以管道输入的形式)获得输入。在命令行给出3个或多
个文件名作为参数时,那几个文件替代标准输入设备成为sed的输入。sed的输出将被
送到正式输出(显示器)。因而:

cat filename | sed '10q' # 使用管道输入
sed '10q' filename # 一样效果,但不选择管道输入
sed '10q' filename > newfile # 将出口转移(重定向)到磁盘上

要询问sed命令的采用表达,包蕴什么样通过脚本文件(而非从命令行)来使用那个命
令,请参阅《sed & awk》第二版,作者Dale Dougherty和Arnold Robbins
(O'Reilly,1997; Text Processing》,作者
Dale Dougherty和Tim O'Reilly(Hayden Books,1987)或者是Mike Arst写的教
程——压缩包的称号是“U-SEDIT二.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'来表示2个制表
符。可是现在超过4八%本子的sed还不能识别't'的简写情势,因而当在命令行中为
剧本输入制表符时,你应当平昔按TAB键来输入制表符而不是输入't'。下列的工
具软件都帮衬't'做为一个正则表明式的字元来表示制表符:awk、perl、HHsed、
sedmod以及GNU sed v3.02.80。

今是昨非版本的SED:不相同的版本间的sed会某个差异之处,能够设想它们之间在语法上
会有差异。具体来讲,它们中山大学部分不帮忙在编排命令中间使用标签(:name)或分
支命令(b,t),除非是身处那个的尾声。那篇文书档案中大家尽量选拔了可移植性较高
的语法,以使大许多本子的sed的用户都能动用这么些本子。但是GNU版本的sed允许使
用更轻巧的语法。想像一下当读者看到1个非常短的通令时的心情:

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 # 显示第45到50行
sed -n '51q;45,50p' filename # 同样,但快得多

假定您有任何的单行脚本想与大家享受或许你发觉了本文书档案中错误的地点,请致电
子邮件给本文书档案的小编(EricPement)。邮件中请记得提供你所利用的sed版本、
该sed所运转的操作系统及对题目标适宜描述。本文所指的单行脚本指命令行的长
度在6三个字符或七17个以下的sed脚本〔译注一〕。本文书档案的各个脚本是由以下所列作
者所写或提供:

Al Aab # 创建了“seders”邮件列表
Edgar Allen # 许多地点
Yiorgos Adamopoulos # 大多方面
Dale Dougherty # 《sed & awk》作者
Carlos Duarte # 《do it with sed》作者
Eric Pement # 本文书档案的撰稿人
Ken Pizzini # GNU sed v3.02 的作者
S.G. Ravenhall # 去html标签脚本

 sed 'G;G'

选取性地删除特定行:

# 展现通篇文书档案,除了三个正则表明式之间的开始和结果
sed '/Iowa/,/Montana/d'

# 删除文件中相邻的重复行(模拟“uniq”)
# 只保留重复行中的第壹行,其余行删除
sed '$!N; /^(.*)n1$/!P; D'

# 删除文件中的重复行,不管有无相邻。注意hold space所能帮助的缓存
# 大小,恐怕利用GNU sed。
sed -n 'G; s/n/&&/; /^([ -~]*n).*n1/d; s/n//; h; P'

# 删除除重复行外的持有行(模拟“uniq -d”)
sed '$!N; s/^(.*)n1$/1/; t; D'

# 删除文件中伊始的十行
sed '1,10d'

# 删除文件中的最终1行
sed '$d'

# 删除文件中的最后两行
sed 'N;$!P;$!D;$d'

# 删除文件中的最后十行
sed -e :a -e '$d;N;2,10ba' -e 'P;D' # 方法1
sed -n -e :a -e '1,10!{P;N;D;};N;ba' # 方法2

# 删除八的倍数行
gsed '0~8d' # 只对GNU sed有效
sed 'n;n;n;n;n;n;n;d;' # 其他sed

# 删除相称式样的行
sed '/pattern/d' # 删除含pattern的行。当然pattern
# 能够换到其余有效的正则表明式

# 删除文件中的全部空行(与“grep '.' ”效果一样)
sed '/^$/d' # 方法1
sed '/./!d' # 方法2

# 只保留八个相邻空行的第一行。并且删除文件顶上部分和尾巴部分的空行。
# (模拟“cat -s”)
sed '/./,/^$/!d' #办法一,删除文件最上部的空行,允许尾部保留1空行
sed '/^$/N;/n$/D' #方法二,允许顶端保存1空行,尾巴部分不留空行

# 只保留八个相邻空行的前两行。
sed '/^$/N;/n$/N;//D'

# 删除文件顶上部分的全体空行
sed '/./,$!d'

# 删除文件尾巴部分的具有空行
sed -e :a -e '/^n*$/{$d;N;ba' -e '}' # 对所有sed有效
sed -e :a -e '/^n*$/N;/n$/ba' # 同上,但只对 gsed 3.02.*有效

# 删除每一种段落的结尾一行
sed -n '/^$/{p;h;};/./{x;/./p;}'

Greg Ubben # 有无数贡献并提供了众多救助

译注一:大多数动静下,sed脚本无论多少长度都能写成单行的样式(通过`-e'选项和`;'
号)——只要命令解释器协助,所以这里说的单行脚本除了能写成壹行还对长度有
所界定。因为那几个单行脚本的意义不在于它们是以单行的款型现身。而是让用户能
有利地在命令行中使用这一个紧密的台本才是其含义所在。

 # 将率先个脚本所产生的兼具空行删除(即除去全体偶数行)

特别应用:

# 移除手册页(man page)中的nroff标志。在Unix System V或bash shell下使
# 用'echo'命令时或许要求丰富 -e 选项。
sed "s/.`echo \b`//g" # 外层的双括号是必须的(Unix情状)
sed 's/.^H//g' # 在bash或tcsh中, 按 Ctrl-V 再按 Ctrl-H
sed 's/.x08//g' # sed 一.伍,GNU sed,ssed所运用的十6进制的表示方法

# 提取音讯组或 e-mail 的邮件头
sed '/^$/q' # 删除第贰行空行后的富有剧情

# 提取信息组或 e-mail 的正文部分
sed '1,/^$/d' # 删除第二行空行此前的保有剧情

# 从邮件头提取“Subject”(标题栏字段),并移除起始的“Subject:”字样
sed '/^Subject: */!d; s///;q'

# 从邮件头拿走回复地址
sed '/^Reply-To:/q; /^From:/h; /./d;g;q'

# 获取邮件地址。在上多少个本子所发生的那一行邮件头的底子上更是的将非电邮
# 地址的有个别剃除。(见上一脚本)
sed 's/ *(.*)//; s/>.*//; s/.*[:<] *//'

# 在每一行起头加上三个尖括号和空格(引用音讯)
sed 's/^/> /'

# 将每一行初叶处的尖括号和空格删除(解除引用)
sed 's/^> //'

# 移除超越二分一的HTML标签(包罗跨行标签)
sed -e :a -e 's/<[^>]*>//g;/</N;//ba'

# 将分为多卷的uuencode文件解码。移除文件头音讯,只保留uuencode编码部分。
# 文件必须以一定顺序传给sed。上面第2种版本的台本能够一向在指令行下输入;
# 第3种版本则足以放入2个带实施权限的shell脚本中。(由Rahul Dhesi的1
# 个脚本修改而来。)
sed '/^end/,/^begin/d' file1 file2 ... fileX | uudecode # vers. 1
sed '/^end/,/^begin/d' "$@" | uudecode # vers. 2

# 将文件中的段落以字母逐一排序。段落间以(一行或多行)空行分隔。GNU sed使用
# 字元“v”来代表垂直制表符,这里用它来作为换行符的占位符——当然你也得以
# 用别的未在文书中应用的字符来代替他。
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/'

# 分别削减每一种.TXT文件,压缩后去除原来的文件并将削减后的.ZIP文件
# 命名叫与原先一样的名字(只是增添名分化)。(DOS景况:“dir /b”
# 展现不带路线的公文名)。
echo @echo off >zipup.bat
dir /b *.txt | sed "s/^(.*).TXT/pkzip -mo 1 1.TXT/" >>zipup.bat

使用SED:Sed接受1个或八个编辑命令,并且每读入一行后就相继使用这一个命令。
当读入第2行输入后,sed对其使用具有的吩咐,然后将结果输出。接着再读入第一
行输入,对其应用具有的吩咐……并再一次那个进程。上1个事例中sed由规范输入设
备(即命令解释器,常常是以管道输入的款式)得到输入。在命令行给出三个或多
个文本名作为参数时,这几个文件取代标准输入设备成为sed的输入。sed的出口将被
送到正规输出(显示屏)。因而:

cat filename | sed '10q' # 使用管道输入
sed '10q' filename # 同样效果,但不采用管道输入
sed '10q' filename > newfile # 将出口转移(重定向)到磁盘上

要领会sed命令的施用表达,包罗如何通过脚本文件(而非从命令行)来选用这么些命
令,请参阅《sed & awk》第二版,作者Dale Dougherty和Arnold Robbins
(O'Reilly,1997; 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或正则表明式的教材,而只是为那1个耳濡目染那一个工具的人
提供的局地文书参照他事他说加以考察。

括号语法:后面包车型客车例证对sed命令基本上都使用单引号('...')而非双引号
("...")那是因为sed平日是在Unix平台上利用。单引号下,Unix的shell(命令
解释器)不会对法郎符($)和后引号(`...`)实行解释和试行。而在双引号下
澳元符会被开始展览为变量或参数的值,后引号中的命令被施行并以输出的结果替代
后引号中的内容。而在“csh”及其衍生的shell中央银行使咋舌号(!)时索要在其前
面丰硕转义用的反斜杠(就如这么:!)以担保方面所采纳的事例能平常运营
(包含使用单引号的情景下)。DOS版本的Sed则壹律采用双引号("...")而不是
引号来圈起命令。

't'的用法:为了使本文物保护持行文简洁,咱们在本子中采取't'来表示3个制表
符。不过今后诸多本子的sed还无法识别't'的简写方式,由此当在命令行中为
剧本输入制表符时,你应当一向按TAB键来输入制表符而不是输入't'。下列的工
具软件都扶助't'做为二个正则表明式的字元来表示制表符:awk、perl、HHsed、
sedmod以及GNU sed v3.02.80。

分裂版本的SED:不一样的版本间的sed会有个别不相同之处,能够想像它们之间在语法上
会有距离。具体来讲,它们中山大学部不支持在编写制定命令中间使用标签(:name)或分
支命令(b,t),除非是献身那几个的终极。那篇文档中大家尽量接纳了可移植性较高
的语法,以使大诸多版本的sed的用户都能使用这么些本子。然则GNU版本的sed允许使
用更简洁的语法。想像一下当读者看到3个相当短的命令时的心情:

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 # 显示第45到50行
sed -n '51q;45,50p' filename # 一样,但快得多

如若您有其余的单行脚本想与我们享受或然您意识了本文书档案中错误的地点,请致电
子邮件给本文书档案的撰稿人(埃里克Pement)。邮件中请记得提供您所选取的sed版本、
该sed所运维的操作系统及对难题的方便描述。本文所指的单行脚本指命令行的长
度在6多少个字符或陆16个以下的sed脚本〔译注一〕。本文书档案的各类脚本是由以下所列作
者所写或提供:

Al Aab # 构建了“seders”邮件列表
Edgar Allen # 大多地点
Yiorgos Adamopoulos # 繁多地点
Dale Dougherty # 《sed & awk》作者
Carlos Duarte # 《do it with sed》作者
Eric Pement # 本文书档案的撰稿人
Ken Pizzini # GNU sed v3.02 的作者
S.G. Ravenhall # 去html标签脚本

 sed 'n;d'

Greg Ubben # 有这一个贡献并提供了重重援救

译注一:大多数气象下,sed脚本无论多少长度都能写成单行的款式(通过`-e'选项和`;'
号)——只要命令解释器支持,所以那边说的单行脚本除了能写成1行还对长度有
所界定。因为这么些单行脚本的意思不在于它们是以单行的花样现身。而是让用户能
惠及地在命令行中使用那些紧凑的本子才是其意义所在。

 # 在相配式样“regex”的行从前布署一空行

 sed '/regex/{x;p;x;}'

 # 在相称式样“regex”的行之后插入壹空行

 sed '/regex/G'

 # 在相配式样“regex”的行从前和后来各插入一空行

 sed '/regex/{x;p;x;G;}'

编号:


 # 为文件中的每1行开始展览编号(简单的左对齐方式)。这里运用了“制表符”

 # (tab,见本文末尾关于't'的用法的叙说)而不是空格来对齐边缘。

 sed = filename | sed 'N;s/n/t/'

 # 对文件中的全体行编号(行号在左,文字右端对齐)。

 sed = filename | sed 'N; s/^/     /; s/ *(.{6,})n/1  /'

 # 对文本中的全体行编号,但只展现非空白行的行号。

 sed '/./=' filename | sed '/./N; s/n/ /'

 # 计算行数 (模拟 "wc -l")

 sed -n '$='

文本转变和代表:


 # Unix景况:调换DOS的新行符(CKuga/LF)为Unix格式。

 sed 's/.$//'                     # 假使全部行以C奥迪Q7/LF停止

 sed 's/^M$//'                    # 在bash/tcsh中,将按Ctrl-M改为按Ctrl-V

 sed 's/x0D$//'                  # ssed、gsed 三.0二.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 三.02.80 及更加高版本

 # DOS环境:转换Unix新行符(LF)为DOS格式。

 sed "s/$//"                      # 方法 1

 sed -n p                         # 方法 2

 # DOS环境:转换DOS新行符(CR/LF)为Unix格式。

 # 上面包车型大巴脚本只对UnxUtils sed 四.0.7及更加高版本有效。要识别UnxUtils版本的

 #  sed能够通过其有意的“--text”选项。你能够动用帮忙采取(“--help”)看

 # 个中有无一个“--text”项以此来判别所使用的是不是是UnxUtils版本。其余DOS

 # 版本的的sed则非常小概开展那一转移。但足以用“tr”来兑现那1退换。

 sed "s/r//" infile >outfile     # UnxUtils sed v四.0.七 或更加高版本

 tr -d r <infile >outfile        # GNU tr 一.2二 或越来越高版本

 # 将每壹行前导的“空白字符”(空格,制表符)删除

 # 使之左对齐

 sed 's/^[ t]*//'                # 见本文末尾关于't'用法的叙说

 # 将每1行拖尾的“空白字符”(空格,制表符)删除

 sed 's/[ t]*$//'                # 见本文末尾关于't'用法的叙述

 # 将每一行中的前导和拖尾的空白字符删除

 sed 's/^[ t]*//;s/[ t]*$//'

 # 在每一行开始处插入多少个空格(使全文向右移动四个字符的岗位)

 sed 's/^/     /'

 # 以七18个字符为宽度,将全数文件右对齐

 sed -e :a -e 's/^.{1,78}$/ &/;ta'  # 74个字符外加最终的一个空格

 # 以七十二个字符为宽度,使全体文本居中。在艺术第11中学,为了让文本居中每壹行的前

 # 头和后边都填充了空格。 在艺术第22中学,在居中文本的历程中只在文件的前面填充

 # 空格,并且最后这么些空格将有四分之贰会被去除。其它每一行的末端并未有填充空格。

 sed  -e :a -e 's/^.{1,77}$/ & /;ta'                     # 方法1

 sed  -e :a -e 's/^.{1,77}$/ &/;ta' -e 's/( *)1/1/'  # 方法2

 # 在每1行中查找字串“foo”,并将找到的“foo”替换为“bar”

 sed 's/foo/bar/'                 # 只替换每壹行中的第二个“foo”字串

 sed 's/foo/bar/4'                # 只替换每1行中的第六个“foo”字串

 sed 's/foo/bar/g'                # 将每一行中的全部“foo”都换到“bar”

 sed 's/(.*)foo(.*foo)/1bar2/' # 替换尾数第一个“foo”

 sed 's/(.*)foo/1bar/'            # 替换最后3个“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 v一.5会将文件中的空行删除

 sed '1!G;h;$!d'               # 方法1

 sed -n '1!G;h;$p'             # 方法2

 # 将行中的字符逆序排列,第三个字形成最后一字,……(模拟“rev”)

 sed '/n/!G;s/(.)(.*n)/&21/;//D;s/.//'

 # 将每两行连接成1行(类似“paste”)

 sed '$!N;s/n/ /'

 # 倘诺当前行以反斜杠“”结束,则将下一行并到当前行末尾

 # 并去掉原来行尾的反斜杠

 sed -e :a -e '/\$/N; s/\n//; ta'

 # 假设当前行以等号起首,将最近行并到上1行末尾

 # 并以单个空格代替原先行头的“=”

 sed -e :a -e '$!N;s/n=/ /;ta' -e 'P;D'

 # 为数字字串扩张逗号分隔符号,将“123456七”改为“一,23四,5陆柒”

 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})/12,3/g;ta'

 # 在每5行后扩张一空白行 (在第四,拾,一五,20,等行后增添1空白行)

 gsed '0~5G'                      # 只对GNU sed有效

 sed 'n;n;n;n;G;'                 # 其他sed

选拔性地出示特定行:


 # 彰显文件中的前十行 (模拟“head”的行事)

 sed 10q

 # 呈现文件中的第一行 (模拟“head -一”命令)

 sed q

 # 呈现文件中的最终10行 (模拟“tail”)

 sed -e :a -e '$q;N;11,$D;ba'

 # 显示文件中的最后贰行(模拟“tail -贰”命令)

 sed '$!N;$!D'

 # 突显文件中的最终一行(模拟“tail -一”)

 sed '$!d'                        # 方法1

 sed -n '$p'                      # 方法2

 # 展现文件中的尾数第一行

 sed -e '$!{h;d;}' -e x              # 当文件中唯有1行时,输入空行

 sed -e '1{$q;}' -e '$!{h;d;}' -e x  # 当文件中唯有1行时,彰显该行

 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'              # 方法一,与最近的一声令下相对应

 sed '/regexp/d'                  # 方法贰,类似的语法

 # 查找“regexp”并将匹配行的上1行显示出来,但并不显得相称行

 sed -n '/regexp/{g;1!p;};h'

 # 查找“regexp”并将相称行的下一行展现出来,但并不显示相配行

 sed -n '/regexp/{n;p;}'

 # 彰显包括“regexp”的行及其前后行,并在率先行以前增加“regexp”所

 # 在行的行号 (类似“grep -A一 -B一”)

 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;”,接下去的三个本子都以这么

 sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;'

 # 突显包蕴“AAA”“BBB”和“CCC”三个字串的段落 (大5次序)

 sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;/BBB/!d;/CCC/!d'

 # 展现包括“AAA”、“BBB”、“CCC”3者中任一字串的段落 (大伍次序)

 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'         # 只对GNU sed有效

 # 呈现包罗67个或上述字符的行

 sed -n '/^.{65}/p'

 # 展现包蕴陆20个以下字符的行

 sed -n '/^.{65}/!p'            # 方法一,与地点的台本相对应

 sed '/^.{65}/d'                # 方法二,更轻易一点的主意

 # 展现部分文件——从包括正则说明式的行初始到终极一行终止

 sed -n '/regexp/,$p'

 # 显示部分文件——钦定行号范围(从第10至第一2行,含8和12行)

 sed -n '8,12p'                   # 方法1

 sed '8,12!d'                     # 方法2

 # 显示第52行

 sed -n '52p'                     # 方法1

 sed '52!d'                       # 方法2

 sed '52q;d'                      # 方法叁, 管理大文件时更有功效

 # 从第二行开头,每七行呈现1遍   

 gsed -n '3~7p'                   # 只对GNU sed有效

 sed -n '3,${p;n;n;n;n;n;n;}'     # 其他sed

 # 展现八个正则表明式之间的公文(包括)

 sed -n '/Iowa/,/Montana/p'       # 区分轻重缓急写形式

选取性地删除特定行:


 # 展现通篇文书档案,除了三个正则表达式之间的原委

 sed '/Iowa/,/Montana/d'

 # 删除文件中相邻的再一次行(模拟“uniq”)

 # 只保留重复行中的第2行,别的行删除

 sed '$!N; /^(.*)n1$/!P; D'

 # 删除文件中的重复行,不管有无相邻。注意hold space所能帮助的缓存

 # 大小,只怕使用GNU sed。

 sed -n 'G; s/n/&&/; /^([ -~]*n).*n1/d; s/n//; h; P'

 # 删除除重复行外的富有行(模拟“uniq -d”)

 sed '$!N; s/^(.*)n1$/1/; t; D'

 # 删除文件中初露的拾行

 sed '1,10d'

 # 删除文件中的最后1行

 sed '$d'

 # 删除文件中的最终两行

 sed 'N;$!P;$!D;$d'

 # 删除文件中的最终十行

 sed -e :a -e '$d;N;2,10ba' -e 'P;D'   # 方法1

 sed -n -e :a -e '1,10!{P;N;D;};N;ba'  # 方法2

 # 删除8的倍数行

 gsed '0~8d'                           # 只对GNU sed有效

 sed 'n;n;n;n;n;n;n;d;'                # 其他sed

 # 删除相称式样的行

 sed '/pattern/d'                      # 删除含pattern的行。当然pattern

                                       # 能够换来任何有效的正则表明式

 # 删除文件中的全数空行(与“grep '.' ”效果一样)

 sed '/^$/d'                           # 方法1

 sed '/./!d'                           # 方法2

 # 只保留七个相邻空行的首先行。并且删除文件顶端和尾部的空行。

 # (模拟“cat -s”)

 sed '/./,/^$/!d'        #方法1,删除文件顶上部分的空行,允许后面部分保留1空行

 sed '/^$/N;/n$/D'      #方法2,允许最上端保留壹空行,尾巴部分不留空行

 # 只保留多少个相邻空行的前两行。

 sed '/^$/N;/n$/N;//D'

 # 删除文件顶上部分的具备空行

 sed '/./,$!d'

 # 删除文件后面部分的富有空行

 sed -e :a -e '/^n*$/{$d;N;ba' -e '}'  # 对所有sed有效

 sed -e :a -e '/^n*$/N;/n$/ba'        # 同上,但只对 gsed 3.02.*有效

 # 删除各类段落的尾声一行

 sed -n '/^$/{p;h;};/./{x;/./p;}'

极度规应用:


 # 移除手册页(man page)中的nroff标志。在Unix System V或bash shell下使

 # 用'echo'命令时只怕需求丰盛 -e 选项。

 sed "s/.`echo \b`//g"    # 外层的双括号是必须的(Unix景况)

 sed 's/.^H//g'             # 在bash或tcsh中, 按 Ctrl-V 再按 Ctrl-H

 sed 's/.x08//g'           # sed 1.5,GNU sed,ssed所运用的十6进制的意味方法

 # 提取新闻组或 e-mail 的邮件头

 sed '/^$/q'                # 删除第三行空行后的保有剧情

 # 提取音讯组或 e-mail 的正文部分

 sed '1,/^$/d'              # 删除第1行空行在此之前的具有内容

 # 从邮件头提取“Subject”(标题栏字段),并移除开首的“Subject:”字样

 sed '/^Subject: */!d; s///;q'

 # 从邮件头拿走回复地址

 sed '/^Reply-To:/q; /^From:/h; /./d;g;q'

 # 获取邮件地址。在上1个剧本所产生的那一行邮件头的功底上进一步的将非电邮

 # 地址的部分剃除。(见上一脚本)

 sed 's/ *(.*)//; s/>.*//; s/.*[:<] *//'

 # 在每一行开首加上1个尖括号和空格(引用音信)

 sed 's/^/> /'

 # 将每一行早先处的尖括号和空格删除(解除引用)

 sed 's/^> //'

 # 移除超过四分之一的HTML标签(包涵跨行标签)

 sed -e :a -e 's/<[^>]*>//g;/</N;//ba'

 # 将分成多卷的uuencode文件解码。移除文件头音讯,只保留uuencode编码部分。

 # 文件必须以一定顺序传给sed。上边第2种版本的台本可以直接在命令行下输入;

 # 第三种版本则足以放入1个带实践权限的shell脚本中。(由Rahul Dhesi的壹

 # 个脚本修改而来。)

 sed '/^end/,/^begin/d' file1 file2 ... fileX | uudecode   # vers. 1

 sed '/^end/,/^begin/d' "[email protected]" | uudecode                    # vers. 2

 # 将文件中的段落以字母逐壹排序。段落间以(一行或多行)空行分隔。GNU sed使用

 # 字元“v”来代表垂直制表符,这里用它来作为换行符的占位符——当然你也足以

 # 用其余未在文书中选取的字符来顶替它。

 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/'

 # 分别回落每种.TXT文件,压缩后去除原来的文件并将削减后的.ZIP文件

 # 命名称为与原来同样的名字(只是扩张名区别)。(DOS情状:“dir /b”

 # 显示不带路径的公文名)。

 echo @echo off >zipup.bat

 dir /b *.txt | sed "s/^(.*).TXT/pkzip -mo 1 1.TXT/" >>zipup.bat

利用SED:Sed接受八个或多少个编辑命令,并且每读入1行后就相继使用那几个命令。

当读入第一行输入后,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; 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”中有关正则说明式的1部分),但

手册提供的新闻相比“抽象”——那也是它一向为人所诟病的。然则,它自然就不

是用来教初学者如何利用sed或正则表明式的教科书,而只是为那个熟习这几个工具的人

提供的某些文书参谋。

括号语法:前面包车型地铁例子对sed命令基本上都施用单引号('...')而非双引号

("...")那是因为sed平时是在Unix平台上使用。单引号下,Unix的shell(命令

解释器)不会对英镑符($)和后引号(`...`)进行表达和实践。而在双引号下

美金符会被开始展览为变量或参数的值,后引号中的命令被试行并以输出的结果替代

后引号中的内容。而在“csh”及其衍生的shell中动用惊讶号(!)时索要在其前

面充足转义用的反斜杠(就像这么:!)以担保方面所选择的事例能不荒谬运转

(包蕴运用单引号的景色下)。DOS版本的Sed则壹律选择双引号("...")而不是

引号来圈起命令。

't'的用法:为了使本文物保护持行文简洁,大家在本子中应用't'来代表一个制表

符。可是未来好些个版本的sed还不可能识别't'的简写情势,由此当在指令行中为

本子输入制表符时,你应当直接按TAB键来输入制表符而不是输入't'。下列的工

具软件都协理't'做为2个正则表明式的字元来表示制表符: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           # 显示第45到50行

   sed -n '51q;45,50p' filename       # 一样,但快得多

如若您有此外的单行脚本想与我们分享只怕你意识了本文书档案中错误的地点,请致电

子邮件给本文书档案的撰稿人(Eric Pement)。邮件中请记得提供您所使用的sed版本、

该sed所运转的操作系统及对难点的合适描述。本文所指的单行脚本指命令行的长

度在6四个字符或65个以下的sed脚本〔译注壹〕。本文书档案的各样脚本是由以下所列作

者所写或提供:

 Al Aab                               # 塑造了“seders”邮件列表

 Edgar Allen                          # 许多方面

 Yiorgos Adamopoulos                  # 大多地点

 Dale Dougherty                       # 《sed & awk》作者

 Carlos Duarte                        # 《do it with sed》作者

 Eric Pement                          # 本文书档案的小编

 Ken Pizzini                          # GNU sed v3.02 的作者

 S.G. Ravenhall                       # 去html标签脚本

 Greg Ubben                           # 有无数贡献并提供了无数扶持


译注一:半数以上情形下,sed脚本无论多少长度都能写成单行的样式(通过`-e'选项和`;'

号)——只要命令解释器帮助,所以那边说的单行脚本除了能写成壹行还对长度有

所界定。因为这几个单行脚本的含义不在于它们是以单行的款型出现。而是让用户能

方便地在命令行中使用这一个紧密的脚本才是其意思所在。

 

文本间隔: -------- # 在每一行前面增添1空行 sed G # 将原本的全数空行删除并在每1行前边扩张壹空行。 # 这样...

本文由bifa688.com发布,转载请注明来源:流编辑器,命令的局地用法