sed的高级应用

一、sed简介

sed是面向流的行编辑器,所谓面向流,是指接受标准输入的输入,输出内容到标准输出上。sed和早期的ed有关,其实在sed中的很多命令,都有ed的影子。

二、sed基本用法

sed可以支持基本正则表达式,sed的运行:

sed [-n][-e] 'command' file(s)
sed [-n] -f scriptfile file(s)

sed的命令command格式:

[address[,address]][!]command [arguments]

sed的address是用行号来标志的,比如'1'表示第一行,'1,5'表示1-5行,也可以用pattern来表示address,这是由正则表达式所支持的。command是应用于它前面所有address上的,如果address为空,那默认就是所有行!

sed脚本结尾有很多有趣的特性,比如:自动输出pattern中的内容,自动读入新行到pattern space中,自动跳回脚本开始处(有点类似于其他语言中的loop)。

三、sed命令总结

+ :::label,标志一个label,用于b/t的跳转
+ =:[address]= 打印出行号
+ a:[address]a\ append text to this line.
+ b:[address[,address]]b[label] 条件分支语句
+ c:[address[,address]]c\ 替换内容
+ d:[address[,address]]d 删除pattern中的所有行,并读入下一新行到pattern中
+ D:[address[,address]]D 删除multiline pattern中的第一行,不读入下一行
+ g:[address[,address]]g 将hold space中的内容拷贝到pattern space中,原来pattern space里的内容清除
+ G:[address[,address]]G 将hold space中的内容append到pattern space\n后
+ h:[address[,address]]h 将pattern space中的内容拷贝到hold space中,原来的hold space里的内容被清除
+ H:[address[,address]]H 将pattern space中的内容append到hold space\n后
+ i:[address]i\ 在address行的前面插入文字,和a反义
+ l:[address[,address]]l 打印pattern space中的内容,不可打印字符打印出ascii
+ n:[address[,address]]n 输出pattern space中的内容,读入下一新行替换掉原来的行
+ N:[address[,address]]N 读入下一行形成multiline pattern,用于跨行处理
+ p:[address[,address]]p 打印出pattern space中的内容
+ P:[address[,address]]P 打印出multiline pattern space中的第一行
+ q:[address]q 碰到address行时退出sed script
+ r:[address]r file 将文件file的内容append到pattern space后
+ s:[address[,address]]s/pattern/replace/[flag] 将pattern替换成replace.flag:
    + n:替换第n个出现的pattern,默认是第一个出现的pattern
    + g:全部替换pattern
    + p:如果替换成功则打印
    + w file:将替换的行写入到文件里
+ t:[address[,address]]t [label] 如果替换成功则跳转
+ w:[address[,address]]w file 将pattern中的内容追加写到file文件
+ x:[address[,address]]x 交换hold space和pattern space的内容
+ y:[address1[,address2]]y/abc/xyz/ 将abc转换为对应的xyz

四、高级应用

1、multiline pattern space

由于sed的正则表达式不能支持段的概念,所以在应用时会存在诸多限制,比如搜索的词或句子是跨行的,那么用一般的方法就很难解决,perl能够支持段,perl的正则表达式的修饰符s可以跨行。所以sed引入了“多行模式空间”的概念,模式空间是sed用来处理问题的一个buffer,sed的命令基本都是对该buffer的操作,除了hold space外!

N/P/D命令用于multiline pattern,当然其他操作于pattern space的命令也可以操作multiline pattern,只不过效果是不一样的!N命令读入新行,形成multiline pattern,而n命令只是先输出pattern space中的内容,再读入新行并替换掉pattern space中原来存在的行。D命令删除multiline pattern中的第一行,但并不自动读入新行,而d命令则是将pattern space中的所有内容都删除,并读入新行到pattern space中去。P命令打印multiline pattern中的第一行,p命令打印所有行,p/P命令用于当输出被屏蔽(supressed)或者遇到删除d/D但又需要打印出被删除的内容或者控制流程不能到达脚本结尾。

2、hold space

为了处理更复杂的应用,单一的pattern space不能满足要求,因此引入hold space,它其实是一块temp buffer,作为pattern space的临时存储用的。命令g/G/h/H/x用于在两种类型的buffer之间的信息传递!

3、高级流程控制命令

b/t两个命令可以用于跳转,我们在脚本中用命令":label"来创建标签后,然后就可以跳转过来,这样可以形成do{}while()式的循环结构。程序语言中一般都会支持顺序/条件/循环等流程控制。所以sed已经具有了一般程序语言的雏形了,可以做一些很复杂的事情。

来源地址:http://hanwoody.livejournal.com/12175.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值