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.
/++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++