sed 参数完全解释


学者,急必失,骄必败……   sed 完全教程    作者:imxfox   QQ:380175779  +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  NAME      sed ‐ stream editor for filtering and transforming text  SYNOPSIS      sed [OPTION]... {script‐only‐if‐no‐other‐script} [input‐file]...  DESCRIPTION     Sed  is  a  stream  editor.  A  stream  editor  is  used  to  perform  basic  text  transformations on an input stream (a file or input from a pipeline).  While in some ways similar to an editor which permits scripted edits (such as ed), sed  works by making only one pass over the input(s), and is consequently  more efficient.   But it is sed’s ability to filter text in a pipeline which particularly distinguishes  it from other types of editors.    中文翻译:Sed 是一个流编辑器,用于处理来自文件或者管道的标准文本的转换工作,尽管在某些方面类 似于允许脚本编辑的编辑器,但是由于 sed 仅仅对其输入进行一次扫面,因此比起其他交互编辑器,sed 更加高效。同时由于 sed 过滤来自管道中的文本,使得它变得与众不同。  补充:Sed 把当前处理的行存储在称为模式空间(pattern space)的临时缓冲区中。一旦 sed 完成对模 式空间按中的行的处理,模式空间中的行就被送往屏幕(除非命令是删除行或者打印到打印机),行被处理 完成以后,就被移出模式空间,程序接着读入下一行,处理、显示、移出……文件输入的最后一行被处理 完以后,sed 结束,通过在临时缓冲区存储每一行,然后再缓冲区中操作该行,保证原始文件不会被破坏。  ‐n, ‐‐quiet, ‐‐silent  suppress automatic printing of pattern space  取消将模式空间中的内容自动打印出来。  解释:也就是说除非指定选项‐n,否则 sed 每执行到命令最后,都会输出存在于模式空间中的行,也就是 处理完缓冲到模式空间中的行以后自动输出模式空间的内容,同时如果有 p 指令,还会在输出 p 指令指定 的行,而当在命令行中使用‐n 选项以后,这种自动工作被禁止,如果使用了 p(小写)指令了以后,只会输 出 p 指令指定的行。  / +++++++++++++++++++++++++++++++++++++++例子 1++++++++++++++++++++++++++++++++++++++  sed.txt 的内容如下:  This is the 1st line.  This is the 2nd line.  sed 命令:sed –e ‘1p’ sed.txt 由于不加‐n 选项,默认的每处理一个模式空间(数据行)sed 自动将处 理完的数据行打印才继续读取下一行,如果指定了‐p 选项,还会再打印 p 指定的行(这里 p 指定第一行)。  所以执行完以上命令后显示:  This is the 1st line.  This is the 1st line.  This is the 2nd line.  如果加了‐n 选项,那个默认的打印动作被禁止,如果指定了‐p 选项,会打印 p 指定的行(这里 p 指定第一 行),命令 sed –ne ‘1p’ sed.txt 执行以后只显示:This is the 1st line.这一行。  学者,急必失,骄必败……   /++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++    ‐e script, ‐‐expression=script  add the script to the commands to be executed  以选项指定的 script 来处理文本。  补充:如果命令行上只有一个指令的时候可以不用写‐e,但是如果有多个指令的话一定要在每个指令的前 面加‐e 选项;sed 指令用引号单引号和双引号指定都可以,或者可以不用引号,这个时候如果指令中有特 殊字符,要用反斜杠\ 来屏蔽掉特殊字符比如“空格”、“;”等 ,所 以 sed 命令:sed ‐e‘1p’sed.txt 可 以这样写: sed ‘1p’sed.txt 不用指定‐e,直接加命令‘1p’或者:sed  1p  sed.txt 不用加引号, 如果指令中有特殊字符的话一定要用反斜杠来转义比如:sed  1s/ line/LINE/p sed.txt 会出现 unterminated `s' command 的错误,如果加了反斜杠 sed 1s/\ line/LINE/p sed.txt 就可以正确运 行,但是建议用单引号,同时写上‐e,否则阅读难度增大。哦差点忘了,如果指令有多个指令,可以有三 种书写方式:1.多个指令写在一起,用分号分隔;2.多个指令分开写,但是要在每个指令前放置‐e;3.使 用 Bash 的分行指令功能,注意在输入单引号后按回车键(Enter)就会出现多行输入的提示符“>”。  / +++++++++++++++++++++++++++++++++++++++例子 2++++++++++++++++++++++++++++++++++++++  sed.txt 的内容如下:  This is the 1st line.  This is the 2nd line.  1.sed 命令:sed –ne ‘1p’ sed.txt 、sed –n ‘1p’ sed.txt 、sed –n 1p sed.txt 执行以后显示  This is the 1st line.  2.sed 命令:sed ‐ne ‘1s/ line/LINE/p’ sed.txt 、sed ‐ne 1s/\ line/LINE/p sed.txt 执行后 显示 This is the 1stLINE.  3.sed 命令:  sed ‐ne '1s/1st/first/g;2s/2nd/second/g;p' sed.txt  或者 sed –n ‐e '1s/1st/first/g' ‐e '2s/2nd/second/g' ‐e 'p' sed.txt  或者:sed –n –e ‘ #按下回车键        >1s/1st/first/g #再按下回车键  >2s/2nd/second/g #同上  >p #同上  >’ sed.txt    以上三种书写形式的命令执行后都会显示:  This is the first line.  This is the second line.  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++    ‐f script‐file, ‐‐file=script‐file  add the contents of script‐file to the commands to be executed  以选项指定的 script‐file 文件来处理文本,也就是可以将 sed 程序写到文件中,然后通过‐f 选项指定 sed 程序。  补充:一条 sed 命令可以同时使用‐e 和 –f 选项。脚本文件中每个指令写在一行或者几个指令写在一行每 个指令之间用分号隔开。建议一个指令写一行!  / +++++++++++++++++++++++++++++++++++++++例子 3++++++++++++++++++++++++++++++++++++++  sed.txt 的内容如下:  学者,急必失,骄必败……   This is the 1st line.  This is the 2nd line.  This is the 3rd line.  sed 命令:sed –n –f sed.script sed.txt 其中 sed.script 的内容如下:    #删除第一行  1d  #在第三行前面插入以下一行数据  3i \  This is the insert line  # 打印当前模式空间的内容  P   执行命令后显示结果如下:  This is the 2nd line.  This is the insert line  This is the 3rd line.  /++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++    ‐i[SUFFIX], ‐‐in‐place[=SUFFIX]  edit files in place (makes backup if extension supplied)  就地编辑文件,如果指定了‐i 的值(suffix)sed 将会备份一份原文件。  解释:就地编辑文件,如果没有该选项,sed 将输出送入标准输出。该选项使 sed 将输出送入原来的输入 文件中,一旦指定了后缀名 suffix 了以后,sed 将备份原来的输入文件,该备份文件名以原文件名后接  suffix 命令,如果想在原文件名和后缀 suffix 之间有一个句点,那么必须在后缀 suffix 中包含一个句 点,‐i 选项后面直接加备份文件后缀,‐i 和后缀之间没有空格。如果文件名需要特殊符号,必须要用反 斜杠转义例如 sed –n –i\ .bak –e ‘command’ txtfile 或者 sed –n –I’ .bak’ –e ‘command’ txtfile 这样得到的备份名为 txtfile□.bak 就可以有空格了(这里我用□代表空格)。  / +++++++++++++++++++++++++++++++++++++++例子 4++++++++++++++++++++++++++++++++++++++  sed.txt 的内容如下(“^$”代表空行):  This is the 1st line.  This is the 2nd line.  ^$   This is the 3rd line.  sed 命令(#后面的文字表示注释):  sed –n –i.bak ‐e '/^$/!{ #“/^$/!”是不要匹配空行,按回车键换行。  >#i 这里是要在当前行前添加  >i \  >  >#a 这里是要在当前行后添加  >;a \  >  >;p  >}' sed.txt  执行以后没有任何显示,是因为处理的结果输入写入到 sed.txt,原来的内容已经备份到  学者,急必失,骄必败…… sed.txt.bak 中了,cat 一下:  sed.txt 的内容如下:    This is the 1st line.      This is the 2nd line.      This is the 3rd line.    Sed.txt.bak 内容为(这里我用“^$”代表空行):  This is the 1st line.  This is the 2nd line.  ^$   This is the 3rd line.  /++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++    ‐c, ‐‐copy  use copy instead of rename when shuffling files in ‐i mode (avoids change of input file  ownership)  当在文件树上操作节点时,使用拷贝,而不是重命名。避免改变输入文件的所有权关系。  解释:这个比较难理解,在含有‐i[suffix]模式下,如果‐i 后面填写了后缀名,如果有‐c 选项,那么 ‐i[suffix]指定的备份所有者将会改变成当前用户,修改后的原文件所有者不改变,如果没有‐c 选项, 原文件改变后所有者变为当前用户,备份文件所有者不改变,也就是为原来文件的所有者。以上前提是在 当前用户对原文件有 w 权限,如果没有 w 权限结果不一样了。  / +++++++++++++++++++++++++++++++++++++++例子 5++++++++++++++++++++++++++++++++++++++  sed.txt 的内容如下:  This is the 1st line.  This is the 2nd line.  This is the 3rd line.  sed.txt 的文件属性为(ls ‐l):‐rw‐rw‐rw‐ 1 root root 66 Dec 11 13:03 sed.txt  然后我用系统中的一个普通用户 centos 执行两个命令  1.sed 命令(带有‐c 选项):  sed –n –c –i.bak –e ‘1p’ sed.txt  用 cat 查看 sed.txt 的内容为:  This is the 1st line.  此时 sed.txt 的文件属性(ls ‐l): ‐rw‐rw‐rw‐ 1 root   root   22 Dec 11 13:41 sed.txt 可以看 到它的内容变了,但是所有者不变,权限也不变;  备份的文件 sed.txt.bak 的内容为:  This is the 1st line.  This is the 2nd line.  This is the 3rd line.  文件属性(ls ‐l): ‐rw‐rw‐r‐‐ 1 centos centos 66 Dec 11 13:41 sed.txt.bak 可以看到备份文件  学者,急必失,骄必败……   所有者变成了 centos 了,而且文件权限也改变了。    2.sed 命令(不带有‐c 选项):  Sed –n –i.bak –e ‘1p’ sed.txt  执行该命令以后,用 cat 查看 sed.txt 文件的内容为:  This is the 1st line.  此时 sed.txt 的文件属性(ls ‐l): ‐rw‐rw‐rw‐ 1 centos centos 22 Dec 11 13:41 sed.txt  可以看到文件 sed.txt 内容改变了,同时文件所有者改变为 centos,文件权限不变;  备份文件 sed.txt.bak 的内容为:  This is the 1st line.  This is the 2nd line.  This is the 3rd line.  文件属性(ls ‐l): ‐rw‐rw‐rw‐ 1 root   root   66 Dec 11 13:40 sed.txt.bak 文件的权限和所有 者不变。  总结:‐c 选项要配合‐i 使用,使用‐c 可以在修改原文件的情况下保持原文件的所有者。如果使用‐i 选项 而不使用‐c 将会改变原文件所有者为当前用户(注意这里说的是“原”文件而不是“源”文件)。如果‐i 指明了后缀,备份的文件的所有者变化正好和原文件变化情况相反;这里的总结只讨论文件的所有者而已 不讨论权限。  /++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++    ‐l N, ‐‐line‐length=N  specify the desired line‐wrap length for the ‘l’ command  也就是说如果后面的 command 中如果有 l(是英文 L 的小写),就可以通过这里的‐l 选项来指定每一行的 显示长度,默认是 70 个字符,如果超过,将会通过跳脱字符“\”来换行。例如 sed ‐n ‐l 10 '1,2l'  textfile  将第一和第二行按每行 10 个字符显示,包括转义字符。  注意:该选项必须要与后面的 –e 指定的指令 l 一起用。  / +++++++++++++++++++++++++++++++++++++++例子 6++++++++++++++++++++++++++++++++++++++  sed.txt 的内容如下:  This is the 1st line.  This is the 2nd line.  This is the 3rd line.  sed 命令:sed –n –l 10 –e ‘l’ sed.txt 执行后显示:  This is t\  he 1st li\  ne.$  This is t\  he 2nd li\  ne.$  This is t\  he 3rd li\  ne.$  l 命令是指用可见的形式打印当前行,$表示行的末尾,而且通过反斜杠换行,如果行中有制表符将会显示 \t 上面的命令就是每行显示 10 个字符。  学者,急必失,骄必败……   /++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++    ‐‐posix  disable all GNU extensions.  禁用所有的 GNU 扩展。  补充:GNU sed 没有早期专门版本的很多限制,如行长度限制,可以轻松处理任意长度的行。  ‐r, ‐‐regexp‐extended  use extended regular expressions in the script.  在脚本中使用扩展正则表达式。  解释:标准的正则表达式由特殊字符“.” 、“^”、“$”、“\”、“*”、“\{n.m}\”、“[]”组成,扩展的正 则表达式由特殊字符“+”、“?”、“|”、“()”组成。  / +++++++++++++++++++++++++++++++++++++++例子 7++++++++++++++++++++++++++++++++++++++  sed.txt 的内容如下:  This is the 1st line.  this is the 2nd line.  This is the 3rd line.  1.sed 命令(不带‐r 选项):sed ‐ne 's/T.?/**/p' sed.txt 执行后没有任何显示;  2.sed 命令(带‐r 选项):sed –n –r –e 's/T.?/**/p' sed.txt 执行以后显示:  **is is the 1st line.  **is is the 3rd line.  它匹配了以大写字母 T 开头接着是一个任意字符的两个字符,然后通过 s 命令替换为“**”。  /++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++    ‐s, ‐‐separate  consider files as separate rather than as a single continuous long stream.  将输入文件视为各个独立的文件而不是一个长的连续输入。  解释:意思是如果[input‐file]选项如果指定有多个文件的话,默认的 sed 将会视为一个单独的流,然 后对这个流进行操作,而如果加了‐s 选项了以后,多个文件将会视为单独的流,后面的操作将会对每一个 单独的流进行同样的操作,比如 sed –n ‐s –e ‘1p’ textfile1 textfile2 将会同时显示 textfile1 和 textfile2 的第二行,也就是加起来一共输出两行,但是如果是 sed –n  –e ‘1p’ textfile1  textfile2 这样的话由于 textfile2 将会加到 textfile1 中作为一个流来处理,这样只会出现一行也就 是合并以后的流的第二行。  / +++++++++++++++++++++++++++++++++++++++例子 7++++++++++++++++++++++++++++++++++++++  sed1.txt 的内容:  This is the 1st line.  This is the 2nd line.  sed2.txt 的内容:  This is the 3rd line.  This is the last line.  1.sed 命令:sed –n –s –e ‘4p’ sed1.txt sed2.txt 不显示任何行,因为‐s 强调了将多个文件视为 独立的流;  2.Sed 命令:sed –n –e ‘4p’ sed1.txt sed2.txt 执行后显示:  This is the last line.  学者,急必失,骄必败……   可见不加‐s 多个文件会和起来作为一个流;比如这里的 sed1.txt 和 sed2.txt 合起来的流为:  This is the 1st line.  This is the 2nd line.  This is the 3rd line.  This is the last line.  存在第四行了,所以’4p’ 就会显示最后一行了。  /++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++    ‐u, ‐‐unbuffered  load minimal amounts of data from the input files and flush the output buffers   从输入文件装载最少的数据,并且刷新输出缓冲区,也就是说尽量少缓冲 input 和 output 要随时更新。  解释:用一个例子来理解,比如:我开启一个 shell 终端,在这个终端输入 tail ‐n 2  ‐f textfile |  sed ‐n ‐u ‐e 'p' 不要关闭,然后又开启另一个 shell 终端,然后我通过 echo 'This is the 17th line'  >>textfile 此时你会发现,第一个 shell 那里马上会刷新出现这一行。也就是说‐u 保证更新的数据随时 得到 sed 的处理。  / +++++++++++++++++++++++++++++++++++++++例子 8++++++++++++++++++++++++++++++++++++++  sed.txt 的内容为:  This is the 1st line.  sed 命令为:tail –n 2 –f sed.txt | sed –n –u –e ‘p’   打开一个 shell 终端,输入以上 sed 命令不要关闭;  打开另一个 shell 终端,输入 echo ‘This is the 2nd line.’ >>sed.txt 此时你会发现第一个终端就 会刷新出这一行,‐u 起到了随时刷新输出缓冲区的作用,没有‐u 选项的话就不会有这个功能的。  /++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++    COMMAND SYNOPSIS  This  is  just  a  brief synopsis of sed commands to serve as a reminder to those who  already know sed; other documentation (such as the texinfo  document) must be consulted for fuller descriptions.  中文翻译:以下内容作为一个简短的梗概,仅仅对那些已经知道 sed 的人做一个提示,如果你想查阅更多 的描述,请参考其他文档,比如 texinfo document。    Zero‐address ‘‘commands’’  不用地址的命令。    : label  Label for b and t commands.  作为分支(b)和测试(t)命令的标签(b 和 t 标签不同,后面再讨论)。  补充:作为高级流控制命令,这个比较难理解, 用一个例子说明一下:  sed –ne ‘:lbtest /addr/{command;b lbtest}’ textfile 执行的时候不要管“:lbtest”它只是一 个标签而已,可以认为是一个记号;首先会通过 addr 来检查当前行,如果当前行匹配 addr 则执行 command, 然后遇到 b 指令,而且 b 指令指定一个 lbtest 标签,无条件的,控制就被直接转移到标签 lbtest 后, 也就是经过第一次 command 以后的行又拿去测试 addr,如果匹配成功,又会在执行 command,然后又遇 到 b 指令,控制有被转移到标签 lbtest 后,这样重复下去,直到数据行不再匹配 addr,就不会再进到  学者,急必失,骄必败……   {command;b lbtest} sed 才开始继续读取下一行重复以上操作……  / +++++++++++++++++++++++++++++++++++++++例子 9++++++++++++++++++++++++++++++++++++++  textfile 内容为  This is the (first) line  This is (the) (second) line  命令:sed –ne ‘:lbtest /\([^)]*\)\(([^)]*)\)\(.*\)/{s//\1\***\3/g;b lbtest};p’ textfile    这个命令的意思是将(first)这样的形式,就是括号的内容(包括括号)替换为“***”,地址 addr  “/\([^)]*\)\(([^)]*)\)\(.*\)/”匹配的是带有(first)这样的形式的行,可以有多个;这里的正则 表达式“/\([^)]*\)\(([^)]*)\)\(.*\)/”分三部分,第一部分“\([^)]*\)”表示的是第一个括号之 前的内容,比如上面的 textfile 的第二行的“This is ”;第二部分“\(([^)]*)\)”表示当前数据行 的第一个带有括号的内容,比如上面的 textfile 的第二行的“(the)”;第三部分“\(.*\)”表示的是第 一个括号后的内容,比如上面的 textfile 的第二行的“ (second) line ”;大括号中的“s//\1\***\3/g” 表示的是替换,“\1”表示的是“\([^)]*\)”匹配的具体内容,“\3“表示的是“\(.*\)”匹配的具体内 容;执行的时候,第一行数据因为匹配“/\([^)]*\)\(([^)]*)\)\(.*\)/”,然后进入大括号执行 s 命 令,执行了以后当前行“This is the (first) line”变为“This is the *** line”,遇到 b 指令, 控制转移到标签 lbtest 后,然后用处理过一次后得到的数据行“This is the *** line”又用 “/\([^)]*\)\(([^)]*)\)\(.*\)/”来检查,这个时候,数据行不再匹配了(因为没有类似(first)这样 的了),然后直接跳到 p 命令,将数据行“This is the *** line”打印出来;有去读取第二行“This is  (the) (second) line”同样,这一行匹配“/\([^)]*\)\(([^)]*)\)\(.*\)/”,经过 s 命令替换第一 个括号结果当前行变为“This is *** (second) line”,遇到 b 指令,控制转移到标签 lbtest 后,然 后用处理过一次后得到的数据行“This  is  ***  (second)  line ”   又用 “/\([^)]*\)\(([^)]*)\)\(.*\)/”来检查,又匹配(因为有(second)),进入大括号,经过 s 命令,当 前行变为“This is *** *** line”,又遇到 b 指令,控制又转移到 lbtest 后,这次数据行“This is  *** *** line”匹配“/\([^)]*\)\(([^)]*)\)\(.*\)/”不再成功了,控制跳到 p 打印当前行“This  is *** *** line”整个过程完成……  最后输出结果为:  This is the *** line  This is *** *** line  /++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++    #comment  The comment extends until the next newline (or the end of a ‐e script fragment).  注释一直延续到下一行(或者一个‐e 脚本片段的末尾)。   }The closing bracket of a { } block.  分组命令大括号的右大括号。  补充:可以用大括号将多个命令集中起来对当前行进行操作。如果想指定行的范围,然后在这个范围内指 定另一个地址,则可以嵌套地址。  / +++++++++++++++++++++++++++++++++++++++例子 10+++++++++++++++++++++++++++++++++++++  sed.txt 的内容为:  red hat is a linux system.  ubunt is a linux system.  学者,急必失,骄必败……   fedora is a linux system.  win7 is a window system.  xp is a window system.  sed 命令(在这里我书写方式是多行模式):  sed ‐ne '/system/{ #选择包含 system 的行;这里按 Enter 键换行  >/linux/{ #从包含 system 的行中选择含有 linux 的行  >s/linux/LINUX/g #将 linux 替换成 LINUX  >}  >/window/{ #从包含 system 的行中选择含有 window 的行  >s/window/WINDOW/g #将 window 替换成 WINDOW  >}  >$a \ #选择最后一行,然后再在行尾添加下面一句话  >red hat and xp are both operating systems.  >p #打印当前行到标准输出   >}' sed.txt  执行命令后显示:  red hat is a LINUX system.  ubunt is a LINUX system.  fedora is a LINUX system.  win7 is a WINDOW system.  xp is a WINDOW system.  red hat and xp are both operating systems.  /++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++    Zero‐ or One‐ address commands  不用地址或者只需要一个地址的命令    = Print the current line number.  输出当前处理行的行号。  补充:不管是空行还是非空行,“=”命令都会自动在当前处理的行的前另做一行显示当前行号。  / +++++++++++++++++++++++++++++++++++++++例子 11+++++++++++++++++++++++++++++++++++++  sed.txt 的内容为:  red hat is a linux system.  ubunt is a linux system.  fedora is a linux system.  sed 命令为:sed ‐ne '=;p' sed.txt 执行后显示:  1  red hat is a linux system.  2  ubunt is a linux system.  3  fedora is a linux system.  /++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  学者,急必失,骄必败……   a \  text  Append text, which has each embedded newline preceded by a backslash.  在当前符合条件的行后面插入文本行,新的文本行用反斜杠“\”与 a 命令隔开。  补充:a、i 和 c 三个命令分别代表追加、插入和更改,是通过多行来指定,每个命令都要求后面跟一个反 斜杠用于转义第一个行尾,指定的追加、插入、更改的行必须要从下一行开始,要输入多行文本,每个连 续的行都必须用反斜杠结束,除了最后一行外。注意 a、i 命令只适用于单行地址,而 c 命令可以一次处 理一个范围的行(后面会给例子)。  / +++++++++++++++++++++++++++++++++++++++例子 12+++++++++++++++++++++++++++++++++++++  sed.txt 的内容为:  red hat is a linux system.  ubunt is a linux system.  fedora is a linux system.  sed 命令为:  sed ‐ne '2,3a\   This is the insert line.  ' ‐e 'p' sed.txt  执行后显示:  red hat is a linux system.  ubunt is a linux system.  This is the insert line.  fedora is a linux system.  This is the insert line.  第二行第三行后面都添加了一行。  /++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++    i \  text  Insert text, which has each embedded newline preceded by a backslash.  在当前符合条件的行的前面插入文本行,新的文本行用反斜杠“\”与 i 命令隔开。  / +++++++++++++++++++++++++++++++++++++++例子 13+++++++++++++++++++++++++++++++++++++  sed.txt 的内容为:  red hat is a linux system.  ubunt is a linux system.  fedora is a linux system.  sed 命令为:  sed ‐ne '2,3i\   This is the insert line.  ' ‐e 'p' sed.txt  执行后显示:  red hat is a linux system.  This is the insert line.  ubunt is a linux system.  This is the insert line.  fedora is a linux system.  学者,急必失,骄必败……   第二行第三行前面都添加了一行。  /++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++    q  Immediately quit the sed script without processing any more input, except that if  auto‐print is not disabled the  current  pattern  space  will be printed.  马上退出 sed 命令,不再处理任何输入,除非没有加‐n(禁止自动输出)选项,否则 sed 还会将当前模式 空间中的内容(当前处理行)输出。    / +++++++++++++++++++++++++++++++++++++++例子 13+++++++++++++++++++++++++++++++++++++  sed.txt 的内容为:  red hat is a linux system.  ubunt is a linux system.  fedora is a linux system.  1.sed 命令(不加‐n 选项):sed ‐e '2q' sed.txt 不用加 p 命令来指定输出,默认可以自动输出,执行 以后显示为:  red hat is a linux system.  ubunt is a linux system.  2.sed 命令(加‐n 选项):sed ‐ne '2q;p’ sed.txt 加了–n 选项,就要通过 p 命令来打印输出,执行以 后显示:red hat is a linux system.  /++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++    Q   Immediately quit the sed script without processing any more input.  马上退出 sed 命令,不再处理任何输入  补充:不管加与不加‐n 选项,sed 都不会将当前模式空间中的内容输出,例如:sed ‐e '9Q' animals.txt  只会输出前八行。而:sed ‐ne '9q' animals.txt 会输出前九行。  / +++++++++++++++++++++++++++++++++++++++例子 14+++++++++++++++++++++++++++++++++++++  sed.txt 的内容为:  red hat is a linux system.  ubunt is a linux system.  fedora is a linux system.  1.sed 命令(不加‐n 选项):sed ‐e '2Q' sed.txt 不用加 p 命令来指定输出,默认可以自动输出,执行 以后显示为:red hat is a linux system.  2.sed 命令(加‐n 选项):sed ‐ne '2q;p’ sed.txt 加了–n 选项,就要通过 p 命令来打印输出,执行以 后显示:red hat is a linux system.  可见只输出 2‐1=1 行  /++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++    r filename  Append text read from filename.  从指定的文件中读取内容,附加到选定行之后。  / +++++++++++++++++++++++++++++++++++++++例子 15+++++++++++++++++++++++++++++++++++++  sed1.txt 的内容为:  学者,急必失,骄必败……   red hat is a linux system.  ubunt is a linux system.  fedora is a linux system.  sed2.txt 内容为:  This is the 1st line.  This is the 2nd line.  sed 命令:sed –ne ‘2r sed2.txt;p’ sed1.txt 执行以后显示:  ubunt is a linux system.  This is the 1st line.  This is the 2nd line.  fedora is a linux system.  可见在在 sed1.txt 的第二行后面附加了 sed2.txt 的内容。  /++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  R filename  Append a line read from filename.  从指定的文件中读取第一行,附加到选定行之后。  / +++++++++++++++++++++++++++++++++++++++例子 16+++++++++++++++++++++++++++++++++++++  sed1.txt 的内容为:  red hat is a linux system.  ubunt is a linux system.  fedora is a linux system.  sed2.txt 内容为:  This is the 1st line.  This is the 2nd line.  sed 命令:sed –ne ‘2r sed2.txt;p’ sed1.txt 执行以后显示:  red hat is a linux system.  ubunt is a linux system.  This is the 1st line.  fedora is a linux system.  可见在在 sed1.txt 的第二行后面附加了 sed2.txt 的第一行内容。  /++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++    Commands which accept address ranges  {      Begin a block of commands (end with a }).  接受地址范围的命令    b label  Branch to label; if label is omitted, branch to end of script.  将控制分支到标签,如果标签被忽略,将控制分支到脚本后面。  解释:b 指令是针对脚本的控制流来说的,意思就是它是用来转移控制,将当前的数据行传到 b 指令指定 的标签后面,标签后的脚本继续处理该数据行。如果 b 没有指定具体的标签,即只有一个 b,那么控制转 移到脚本末尾,如果有具体而且存在的标签,将会将控制转移到指定标签后,这个叫无条件转移(就是不管 怎么样,只要控制流到它这里,它都会转移,要么转移到具体标签后面,要么转移到脚本末尾)。  学者,急必失,骄必败……   / +++++++++++++++++++++++++++++++++++++++例子 17+++++++++++++++++++++++++++++++++++++  请看“: label”那里。  /++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++    t label  If  a s/// has done a successful substitution since the last input line was read and since  the last t or T command, then branch to label;  if label is omitted, branch to end of script.  如果 s 指令发生替换操作,尽管已经读入输入的最后一行,或者已经是最后的 t、T,都会转移到指定的标 签后;如果忽略具体的标签,将会将控制转移到脚本末尾。    / +++++++++++++++++++++++++++++++++++++++例子 18+++++++++++++++++++++++++++++++++++++  sed.txt 的内容为:  I feel so "cold" and the winter this year is "pretty   cold". I decide to buy some "winter clothes".  想把双引号换成,即将"cold" 替换为:cold,由于这个的脚本复杂点,这次把放指 令在 sed.script 文件里,sed.script 中的指令内容为:  :begin  /\(\"\)\([^\"]*\)\(\"\)/{ #匹配双引号和引号之间的内容,同时将正则表达式分三组  s//\2<\/b>/g #这里是替换指令,//表示上个正则表达式 \2 表示前面正则表达式的第二部分  b begin #控制被转移到标签 gebin 后  }  /".*/{ #匹配只有一个双引号的行,例如 "pretty  N #构建多行模式空间,将下一行附加到当前行,并用换行符分隔  s/\("\)\([^"]*\n[^"]*\)\("\)/\2<\/b>/g #匹配多行模式下的双引号和引号之间的内容  t again #如果上面的 s 指令成功替换,那么测试命令 t 将控制转移到 again 后  b begin #如果上面的 s 指令没有替换成功,那么分支命令 b 将控制转移到 begin 后  }  :again  P #大写的之母 P,输出当前模式空间中的第一行  D #删除当前模式空间中的第一行,但是将控制转移到脚本开始来处理剩下的行  sed 命令:sed –n –f sed.script sed.txt 整个命令执行流程如下:    sed 将 sed.txt 第一行即:I feel so "cold" and the winter this year is "pretty  读入模式空间, 然后正则表达式 /\(\"\)\([^\"]*\)\(\"\)/ 检查这一行,发现匹配了 "cold" 然后  进入第一个指令块,指令 s//\2<\/b>/g 将 "cold" 替换为cold<\/b> 其中 \2 代表 cold,控 制到达 b begin ,b 将控制转移到标签 begin 后;此时当前数据行的内容为:I feel so cold  and the winter this year is "pretty 然后正则表达式 /\(\"\)\([^\"]*\)\(\"\)/ 检查这一行, 发现不匹配了;控制跳过第一个指令块,到达 /".*/ 即第二个指令块的开始,正则表达式/".*/ 检查这 一行,发现匹配了当前行的 "pretty ,进入这个指令块,N 命令将当前行的下一行读取进模式空间追加 到当前行后面,并用换行符分隔,此时模式空间中的内容为:I feel so cold and the winter  this year is "pretty\n cold". I decide to buy some "winter clothes",然后指令  s 中的正则表达式/\("\)\([^"]*\n[^"]*\)\("\)/去检查当前模式空间的内容,发现匹配了"pretty\n   学者,急必失,骄必败…… cold",s 命令就将"pretty\n cold"替换为pretty\n cold,控制到了 t again 处,测试命令 t 被告知 s 命令发生替换了,这个时候 t 指令将控制流转移到标签 again 后,执行 P(大写的),这个指令会 将 I feel so cold and the winter this year is pretty\n cold. I decide to  buy some "winter clothes"中换行符\n 之前的内容(包括换行符)即:I feel so cold and  the winter this year is pretty\n 打印出来,这个时候遇到 D 命令,这个命令和 d 不一样,D 只会将模式空间中直到第一个嵌入的换行符的这部分内容,这个时候当前行的内容变为: cold. I  decide to buy some "winter clothes",然后它不会导致读入新的输入新行,在将当前控制转移到脚  本开始,即将当前行又从头开始执行指令,继续看它的流程……  第一个正则表达式 /\(\"\)\([^\"]*\)\(\"\)/ 检查数据行 cold. I decide to buy some  "winter clothes" 发现匹配了"winter clothes"好了,进入第一个指令块,s 指令将"winter clothes" 替换为winter clothes,然后制到达 b begin ,b 将控制转移到标签 begin 后,当前内容为:  cold. I decide to buy some winter clothes;正则表达式 /\(\"\)\([^\"]*\)\(\"\)/  检查该行,但是不匹配了,控制跳到/".*/ 它检查数据行,发现不匹配了,控制跳过该数据块,到达 P, 这个时候只有一行数据了,P 直接把它打印,到了 D,由于模式空间只有一行数据,删除这行数据,模式空 间没有内容,也没有输入流了,整个流程完成,最后显示的结果是:  I feel so cold and the winter this year is pretty   cold. I decide to buy some winter clothes.  /+++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++    T label  If no s/// has done a successful substitution since the last input line was read and  since the last t or T command, then branch to label;  if label is omitted, branch to end of script.  和 t 差不多,只是这里是 s 指令没有发生替换操作然后就转移控制到指定标签,如果 s 指令发生替换,就 不转移控制。  / +++++++++++++++++++++++++++++++++++++++例子 19+++++++++++++++++++++++++++++++++++++  sed.txt 的内容为:  Redhat and Ubuntu are both great operating systems.  redhat and Ubuntu are both great operating systems.    sed 脚本放在 sed.script 文件中,脚本内容如下:  s/Redhat/REDHAT/g #将 Redhat 替换为 REDHAT  T another #如果上面没有发生替换,则将控制转移到 another 标签后  b end #如果控制流到达这里都无条件的转移到 end 标签  :another   s/Ubuntu/UBUNTU/g  :end  p #打印当前模式空间的内容  意思就是说如果将 Redhat 替换替换成了 REDHAT 就不用替换同行的 Ubuntu,如果没有将 Redhat 替换替 换成了 REDHAT,替换同行的 Ubuntu 为 UBUNTU ;所以执行 sed 命令:sed ‐n ‐f sed.script  sed.txt 后结果如下:  REDHAT and Ubuntu are both great operating systems.  redhat and UBUNTU are both great operating systems.  /+++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++  学者,急必失,骄必败……   c \  text Replace the selected lines with text, which has each embedded newline preceded by  a backslash.  用新的文本去修改选定的行,新的文本行用反斜杠“\”与 c 命令隔开。  补充: c 命令将选定的行修改为新的文本,如果指定的是一个地址范围,c 指令将把整个范围内的行替换 成新文本。  / +++++++++++++++++++++++++++++++++++++++例子 20+++++++++++++++++++++++++++++++++++++  sed.txt 的内容为:  This is a dog.  This is a cat.  This is a horse.  This is a lion.  sed 命令为:  sed ‐ne '1,3c\ #按 Enter 换行  >This is a bird.   >p' sed.txt  运行后的结果为:  This is a bird.  This is a lion.  也就是说 c\命令将 1‐3 的一共三行替换为 This is a bird.  如果将 c\命令换成 i\命令即:  sed ‐ne '1,3i\ #按 Enter 换行  >This is a bird.   >p' sed.txt  执行以后结果为:  This is a bird.  This is a dog.  This is a bird.  This is a cat.  This is a bird.  This is a horse.  This is a lion.  可以看到在 1‐3 一共三行,每行的前面插入 This is a bird.这一行,它与 c\命令不同就在于此。  /+++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++    d   Delete pattern space.  Start next cycle.  删除模式空间中的全部行,继续进行下一行。    D   Delete  up  to the first embedded newline in the pattern space.  Start next cycle,  but skip reading from the input if there is still data  in the pattern space.  在模式空间中删除掉第一行文本,开始从 input 中读取下一行,但是如果此时模式空间中还有文本行,将 会再用这个数据行进行 sed script 一次。  学者,急必失,骄必败……   解释:如果模式空间中只有一行数据,那么 d 和 D 效果一样,为什么呢,因为 sed 所有的命令都工作在模 式空间(Pattern space)上,而模式空间保存着 sed 刚刚从输入中读取的行;其中 D 命令表示只删除模式 空间内的第一行,而 d 则将当前模式空间中的所有数据删除。如果模式空间中只有一行数据,用 D 和 d 都 会删除这一行数据,但是如果模式空间中有多行数据,例如通过 N 命令可以使得 sed 将当前行的下一行数 据附加到当前行后面,然后作为一个整体由 sed 命令处理,也就是说这个情况下模式空间有两行数据,这 个时候用 d 命令将会删除掉着两行,但是用 D 命令的话,sed 只会删除第一行,剩下还有一行数据,这个 时候 sed 不会马上跳过着一行数据,叫 sed 继续从 input 中读取新的一行到模式空间中,而是继续用这一 行数据和之前的数据行一样执行 sed script;而 d 呢?它删除完模式空间中的数据以后,因为当前模式 空间中没有数据了,它会叫 sed 从 input 中继续读入下一行,然后处理。  / +++++++++++++++++++++++++++++++++++++++例子 21+++++++++++++++++++++++++++++++++++++  sed.txt 的内容为:  This is a dog.  This is a cat.  sed 命令放在 sed.script 文件中,脚本如下:  /dog/{ #选择含有 dog 的行  N #将当前行的下一行追加到当前行,并用换行符隔开  d #删除当前模式空间的全部行  }  /cat/{ #选择含有 cat 的行  s/cat/lion/g #将 cat 替换为 lion  }  p #打印当前行    运行以后没有输出任何行;将上面的 d 改为 D 以后运行,结果为:  This is a lion.  流程:首先 sed 读入 This is a dog.由于匹配了/dog/,执行 N 将 当前行的下一行即:This is a cat.  追加到当前行,用换行符隔开,所有当前行的内容为:  This is a dog.\nThis is a cat.接下来如果是 d,则会删除 This is a dog.\nThis is a cat.由 于已经没有输入行了,sed 退出;如果是 D,则只会删除 This is a dog.\n;剩下的 This is a cat. 将会被控制流送到脚本开始,重新匹配/dog/,由于匹配不成功,控制流跳到/cat/,由于匹配成功了,将 cat 替换为 lion,最后打印出来,sed 退出。  /+++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++    h H    Copy/append pattern space to hold space.  将模式空间(Pattern space)中的数据复制/追加到保留空间(Hold space)中。  补充:sed 有两个缓冲区:模式空间(Pattern space)和保留空间(Hold space);所有的命令都工作在 模式空间上,模式空间保存着 sed 刚刚从输入中读取的行,保留空间作为临时缓冲区,可以在 sed script 操作模式空间中的数据的时候用来暂存模式空间上的数据,在将数据放入保留空间的之前,保留空间的内 容为空;h 将模式空间中的内容复制到保留空间中,同时保留空间中原来的数据将会全部丢失,H 只会将模 式空间的内容附加到保留空间原有内容的后面同时用一个换行符隔开。  / +++++++++++++++++++++++++++++++++++++++例子 22+++++++++++++++++++++++++++++++++++++  sed.txt 的内容为:  This is a dog.  学者,急必失,骄必败……   This is a cat.  This is a horse  sed.script 脚本文件的内容为(每个指令一行):  1{ #选择第一行  h #将第一行从模式空间复制到保留空间  d #删除当前模式空间的全部行,继续读入下一行  }  2{ #选择第二行  h #将第二行从模式空间复制到保留空间,这个时候,保留空间的内容会被覆盖   d #删除当前模式空间的全部行,继续读入下一行  }  G #将当前保留空间的内容追加到当前行,也就是第三行后,用换行符隔开  p #打印当前模式空间的内容  运行 sed 命令:sed –n –f sed.script sed.txt 结果为:  This is a horse  This is a cat.  如果将 sed.script 中  2{ #选择第二行  h #将第二行从模式空间复制到保留空间,这个时候,保留空间的内容会被覆盖   d #删除当前模式空间的全部行,继续读入下一行  }  的 h 换成 H 即  2{ #选择第二行  h #将第二行从模式空间追加到保留空间,并用换行符隔开   d #删除当前模式空间的全部行,继续读入下一行  }  再次运行 sed 命令:sed –n –f sed.script sed.txt 结果如下:  This is a horse  This is a dog.  This is a cat.  /+++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++    g G    Copy/append hold space to pattern space.  将保留空间(Hold space)的数据复制/追加到模式空间(Pattern space)中。  提示:原理同 h/H,只是内容传输方向相反,不多说了。  / +++++++++++++++++++++++++++++++++++++++例子 23+++++++++++++++++++++++++++++++++++++  sed.txt 的内容为:  This is a dog.  This is a cat.  This is a horse  sed.script 脚本内容如下(每个指令一行,这个脚本有点难度的):  2,$G #如果当前行不为第一行,则将保留空间的内容附加到当前模式空间中,用换行符隔开  h #将当前行复制到保留空间,此时保留空间原有的内容被覆盖  学者,急必失,骄必败……   $!d #如果不是最后一行删除掉当前模式空间的全部内容,继续读取下一行  p #打印当前模式空间的内容  执行 sed 命令:sed –n –f sed.script sed.txt 结果如下:  This is a dog.  This is a cat.  This is a horse  也就是将原有的行反向输出。  /+++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++    x      Exchange the contents of the hold and pattern spaces.  交换保留空间(Hold space)和模式空间(Pattern space)的内容。  / +++++++++++++++++++++++++++++++++++++++例子 24+++++++++++++++++++++++++++++++++++++  sed.txt 的内容为:  This is a dog.  This is a cat.  sed.script 脚本的内容为:  1{ #选择第一行  s/dog/DOG/g #替换 dog 为 DOG  h #将当前模式空间的内容复制到保留空间  d #删除当前模式空间的内容,继续读取下一行  }  2{ #选择第一行  G #读取保留空间的内容追加到当前模式空间的后面  }  p #打印当前模式空间的内容  执行 sed 命令:sed –n –f sed.script sed.txt 结果为:  This is a cat.  This is a DOG.  /+++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++    l   List out the current line in a ‘‘visually unambiguous’’ form.  将当前行以可见的严格的形式列出来。  补充:严格来说这里的 l(L 的小写)是指以可见的严格的形式列出当前模式空间(Pattern space)中的内 容。这里的可见的严格的形式是指:用 C 形式的转义符显示不可打印(non‐printed)字符,同时模式空间 的内容的末尾用一个“$”来表示。默认每行最多 70 个字符,可以通过 l 指令后面加具体数字指定,也可 以通过‐l 选项指定每行显示的字符数。  / +++++++++++++++++++++++++++++++++++++++例子 25+++++++++++++++++++++++++++++++++++++  sed.txt 的内容为:  This is the 1st  line.  This is the 2nd  line.  sed 命令:sed ‐ne 'l 10' sed.txt  或者 sed ‐l 10 ‐ne 'l' sed.txt 结果都是相同的:  This is t\  he 1st\t \  学者,急必失,骄必败……   line.$  This is t\  he 2nd\t \  line.$  l 指令将 1st 和 2nd 后的制表符用\t 显示,每个模式空间中行再以每行 10 个字符显示,用反斜杠作为换 行标志,同时每个模式空间内容的末尾用$表示。  /+++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++    n N    Read/append the next line of input into the pattern space.  将当前行的下一行数据覆盖/追加进当前模式空间(Pattern space)的内容。  提示:其中 n 表示将模式空间中内容的下一行数据读取进来,这个时候模式空间中原有的内容将会被覆盖; N 表示将模式空间中内容的下一行数据读取,然后追加到模式空间中原有的内容后,并用反斜杠隔开。  / +++++++++++++++++++++++++++++++++++++++例子 26+++++++++++++++++++++++++++++++++++++  sed.txt 的内容为:  This is a dog.  This is a cat.  sed 命令:  sed ‐ne ' #按 Enter 键换行  >1{ #选择第一行  >s/dog/DOG/g #替换 dog 为 DOG  >n #读取第二行,覆盖当前行  >s/cat/CATT/g #将 cat 替换为 CAT  >p #打印当前模式空间的内容  >}  >' sed.txt  运行上面的命令,结果为:  This is a CATT.  如果将上面的 n 换成 N,结果为:  This is a DOG.  This is a CATT.  /+++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++++++  P(小写)   Print the current pattern space.  打印当前模式空间(Pattern space)中的全部内容。    P(大写)   Print up to the first embedded newline of the current pattern space.  打印当前模式空间(Pattern space)中内容的第一行数据。  提示:之前说过模式空间是可以存在多行数据的,p(小写)和 P(大写)作用不同在于,前者打印全部,而后 者只打印第一行。  / +++++++++++++++++++++++++++++++++++++++例子 27+++++++++++++++++++++++++++++++++++++  sed.txt 的内容为:  This is a dog.  This is a cat.  sed 命令:  学者,急必失,骄必败……   sed ‐ne ' #按 Enter 键换行  >1{ #选择第一行  >N #将第二行追加到当前行  >P #大写 P,打印当前模式空间的第一行  >}  >' sed.txt  执行以后显示结果为:  This is a dog.  将以上命令中的大写 P 换成小写 p 执行后显示结果为:  This is a dog.  This is a cat.  /++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++    s/regexp/replacement/  Attempt to match regexp against the pattern space.  If successful, replace that portion  matched with replacement. The  replacement may contain the  special  character  & to  refer to that portion of the pattern space which matched, and the special escapes \1  through \9 to refer to the corresponding matching sub‐expressions in the regexp.  尝试对模式空间中的内容进行正则表达式“regexp”的匹配,如果匹配成功,将会用“replacement”来 代替匹配的部分;“replacement”可以包含特殊字符“&”,“&”用来代替匹配“regexp”的模式空间的 内容,而\1、\2、\3……\9 表示“regexp”的子表达式的匹配内容。  提示:1、2、3……等数据第几个子表达式的意思。  / +++++++++++++++++++++++++++++++++++++++例子 28+++++++++++++++++++++++++++++++++++++  sed.txt 的内容为:  It is my dog,and your dog is there.  sed 命令:sed ‐ne 's/\(.*\)\(dog\)\(.*\)\(dog\\(.*\)/\1horse\3bird\5/g;p' sed.txt  执行结果:  It is my horse,and your bird is there.  其中\1 代表第一个\(.*\)匹配的内容,这里匹配:It is my ;\3 代表第二个\(.*\)匹配的内容,这里 匹配的是:,and your ;\5 代表第三个\(.*\)匹配的内容,这里匹配的是:is there.。  /++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++    w filename  Write the current pattern space to filename.  将当前模式空间(Pattern space)的全部内容写入到文件“filename”中    W filename  Write the first line of the current pattern space to filename.  将当前模式空间(Pattern space)内容中的第一行写入到“filename”中。  / +++++++++++++++++++++++++++++++++++++++例子 29+++++++++++++++++++++++++++++++++++++  sed.txt 的内容为:  sed.txt 的内容为:  This is a dog.  学者,急必失,骄必败……   This is a cat.  sed 命令:  sed ‐ne ' #按 Enter 键换行      >1{ #选择第一行  >N #将下一行追加到当前模式空间,并用换行符隔开  >w sed.write #将当前模式空间中的内容全部写入 sed.write 中  >}  >' sed.txt  执行以上命令 sed.write 的内容为:  This is a dog.  This is a cat.  如果将以上命令中的 w 换成 W 执行以后,sed.write 的内容为:  This is a dog.  /++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++    y/source/dest/  Transliterate  the  characters  in  the  pattern  space  which  appear  in  source  to  the  corresponding character in dest.  用另一种字母体系将模式空间(Patter space)内出现的“source”字符替换成对应的“dest”字符。  提示:这个命令说白了就是转换数据中的字元,例如指令:y/abc.../xyz.../ 针对这个指令  /abc.../xyz.../(x、y、z、a、b、c 代表某些字元)为 y 的参数,其中 abc... 与 xyz... 的字元个 数必须相同;sed 执行转换时,将 模式空间内数据中的 a 字元转换成 x 字元 、b 字元转换成 y 字元 、 c 字元转换成 z 字元……  / +++++++++++++++++++++++++++++++++++++++例子 30+++++++++++++++++++++++++++++++++++++  sed.txt 的内容为:  sed.txt 的内容为:  This is a dog.  This is a cat.  sed 命令为:  sed ‐ne ' #按 Enter 键换行  >y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/ #将小写字母换成大写字母  >p #打印当前模式空间的内容  >' sed.txt  执行以后结果为:  THIS IS A DOG.  THIS IS A CAT.  注意那两个元字符集个数要一样,而且对应才能互相转换。  /++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++    Addresses  Sed commands can be given with no addresses, in which case the command will be executed  for all input lines; with one address, in which case the  command  will  only  be executed for input lines which match that address; or with two   学者,急必失,骄必败……   addresses, in which case the command will be executed for  all input lines which match the inclusive range of lines starting from the first address  and continuing to the second address.  Three things  to  note about address ranges: the syntax is addr1,addr2 (i.e., the addresses are separated  by a comma); the line which addr1 matched will always be  accepted, even if addr2 selects an earlier line; and if addr2 is a regexp, it will not  be tested against the line that addr1 matched.  Sed 命令可以不用给定地址(通过行号或者正则表达式选定),这时候命令将会对所有的行进行处理;如果 有一个地址,指定将会作用于该地址选择的每一行输入;如果有两个地址,命令将会作用于从地址 1 到地 址 2 的所有行。关于地址范围的三个提示:1.地址表达语法为 addr1,assr2(地址之间用逗号隔开);2. 所有匹配第一个地址的数据行都会被处理,尽管第二个地址比第一个地址先匹配;3.如果第二个地址是一 个正则表达式,它将不会对第一个地址匹配的行进行测试。  补充:关于指定两个地址的情况,命令将会对由 addr1 和 addr2 匹配而组成的数据行进行操作,其中组行 是这样划分的,首先由 addr1 匹配,匹配的数据行作为第一组的开始,第二个地址 addr2 要选择后续的行 来匹配,选择到的行作为第一组的尾行,如果没有在后续行找到与第二个地址 addr2 匹配的行,那么第二 个地址将会指向文件末尾,以上就是第一组数据行;接着 addr1 又开始从第一组数据行后匹配数据行作为 下一组的行首,然后 addr2 匹配数据行为行尾,如此循环,直到将整个文件处理完毕。     After the address (or address‐range), and before the command, a !  may be inserted, which  specifies that the command shall only be  executed  if  the address (or address‐range) does not match.  在地址后面,和在命令之前之间肯会插入一个感叹号(!),它将会明确指出,只有那些不匹配地址(或者范 围地址)的行才会被命令处理。    The following address types are supported:  Sed 同时还支持以下地址类型    number Match only the specified line number.  选择由 number 明确指定的行。    first~step  Match  every  step’th  line starting  with  line first. For example, ‘‘sed ‐ n 1~2p’’  will print all the odd‐numbered lines in the input stream, and the address 2~5 will match  every fifth line, starting with the second. (This is an extension.)  选择由 first 指定的行开始(包括 first 指定的行),每隔 step 的行。比如:“sed –n 1~2p”将会从输 入流中取出奇数行来打印,地址“2~5”将从第 2 行开始匹配,同时下来每 5 行选择匹配一行。    $   Match the last line.  选择最后一行。    /regexp/      Match lines matching the regular expression regexp.  选择匹配正则表达式的行。 学者,急必失,骄必败……   \cregexpc       Match lines matching the regular expression regexp.  The c may be any character.  选择匹配正则表达式的行,其中 c 可以是任何字符。(说白了就是用 c 来指定正则表达式,平时我们都用斜 杠,就是 c 默认的是斜杠,你可以指定其他字符) GNU sed also supports some special 2‐address forms:  GNU sed 同时还支持特殊的两个地址(2‐address)的形式:    0,addr2  Start out in "matched first address" state, until addr2 is found.  This is similar to  1,addr2, except that  if  addr2  matches  the  very first  line  of  input the  0,addr2  form will be at the end of its range, whereas the 1,addr2 form will still be at the beginning  of its range.  开始时就处于第一个地址已经匹配了的状态,(对应的命令就会一开始就处理行)直到找到第二个地址。这 一点很像 1,addr2,但是如果 addr2 匹配了输入的第一行,“0,addr2”的行范围就会在第一行结束,但是 “1,addr2”的范围才刚刚开始。  解释:不管是“0,addr2”还是“1,addr2” 行的范围都只有一个,而且都是一开始就默认已经处于该范 围之中了,直到匹配 add2,则在执行与之对应的代码后退出该地址范围;他们的不同是“1,addr2”的 addr2 是从第二行开始去检查, “0,addr2” 的 addr2 是从第一行开始检查。     addr1,+N       Will match addr1 and the N lines following addr1.  将会选择匹配了 addr1 和它后面的 N 行作为地址范围。    addr1,~N       Will match addr1 and the lines following addr1 until the next line  whose input line  number is a multiple of N.  将会选择匹配了 addr1 和它后边的行,直到输入的下一行的行号是 N 的倍数。  解释:例如:sed –ne ‘/2/,~3p’ textfile 将会选择含有 2 的行作为地址范围的开始,直到行号为 3 的倍数比如行号为 3、6、9、12 的行(包括此行)。假设行号为 4 的行包含 2 那么,这个行将作为开始,然 后到取第五行,到了第六行,6 为 3 的倍数,作为地址范围的结束,那么这个地址范围为第 4,5,6 行;第 六行之后再去匹配/2/重复以上,可能就会得到多个地址范围。 
还剩22页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 5 金币 [ 分享pdf获得金币 ] 3 人已下载

下载pdf

pdf贡献者

daoming

贡献于2012-07-16

下载需要 5 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf