Sed 的man手册参数详细解释(四)

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.

/++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值