sed学习笔记



学习资料:《sed & awk》读书笔记之 sed 篇


用法:sed [options] script filename
script是指需要对输入进行的一个或者多个操作指令。
每条指令由pattern和procedure组成,pattern一般为‘/’分割的正则表达式(也有可能是行号),procedure则是一连串编辑命令。

sed的处理流程:
  1. 读入新的一行内容到缓存空间(被称为模式空间-pattern space
  2. 取出第一条指令,判断是否匹配pattern
  3. 若不匹配,返回2,取下一条指令
  4. 若匹配,则针对缓存的行执行后面的编辑命令;完成后,返回2,取下一条指令
  5. 当所有指令都应用完之后,输出缓存行的内容;返回1,继续取新的一行
  6. 所有行都处理完,则结束
实例:
假如有文件list,内容是:
John Daggett, 341 King Road, Plymouth MA
Alice Ford, 22 East Broadway, Richmond VA
Orville Thomas, 11345 Oak Bridge Road, Tulsa OK
Terry Kalkas, 402 Lans Road, Beaver Falls PA
Eric Adams, 20 Post Road, Sudbury MA
Hubert Sims, 328A Brook Road, Roanoke VA
Amy Wilde, 334 Bayshore Pkwy, Mountain View CA
Sal Carpenter, 73 6th Street, Boston MA
替换命令s:
input:
sed 's/MA/ Massachusetts/' list
output:

只想输出替换命令影响的行,需要用到s命令的p选项:
input:
sed 's/MA/ Massachusetts/p' list
output:
John Daggett , 341 King Road , Plymouth , Massachusetts
John Daggett , 341 King Road , Plymouth , Massachusetts
Alice Ford , 22 East Broadway , Richmond VA
Orville Thomas , 11345 Oak Bridge Road , Tulsa OK
Terry Kalkas , 402 Lans Road , Beaver Falls PA
Eric Adams , 20 Post Road , Sudbury , Massachusetts
Eric Adams , 20 Post Road , Sudbury , Massachusetts
Hubert Sims , 328A Brook Road , Roanoke VA
Amy Wilde , 334 Bayshore Pkwy , Mountain View CA
Sal Carpenter , 73 6th Street , Boston , Massachusetts
Sal Carpenter , 73 6th Street , Boston , Massachusetts
输出的不对,这是因为sed命令应用之后会将所有缓存的行打印输出,通过-n参数,可以抑制这种输出,达到我们想要的效果:
input:
sed -n 's/MA/ Massachusetts/p' list
output:
John Daggett , 341 King Road , Plymouth , Massachusetts
Eric Adams , 20 Post Road , Sudbury , Massachusetts
Sal Carpenter , 73 6th Street , Boston , Massachusetts

地址匹配:
sed 'd' list
sed '1d' list
sed '$d' list
sed '/MA/d' list
sed '2,$d' list
sed '/Alice/,/Hubert/d' list
sed '2,/Hubert/d/' list
sed '2,/Hubert/!d/' list

如果要对指定行执行多个命令,则可以用{},相当于编程语言的语句块。
例如: sed - n '1,4{s/ MA/,Massachusetts/;s/ PA/,Pennsylvania/p}' list


基础命令:

名称命令语法说明
替换s[address]s/pattern/replacement/flags替换匹配的内容
删除d[address]d删除匹配的行
插入i[line-address]i\text在匹配行的前方插入文本
追加a[line-address]a\text在匹配行的后方插入文本
行替换c[address]c\text将匹配的行替换成文本text
打印行p[address]p打印在模式空间中的行
打印行号=[address]=打印当前行行号
打印行l[address]l打印在模式空间中的行,同时显示控制字符
转换字符y[address]y/SET1/SET2/将SET1中出现的字符替换成SET2中对应位置的字符
读取下一行n[address]n将下一行的内容读取到模式空间
读文件r[line-address]r file将指定的文件读取到匹配行之后
写文件w[address]w file将匹配地址的所有行输出到指定的文件中
退出q[line-address]q读取到匹配的行之后即退出


替换命令s:
[address]s/pattern/replacement/flags,flags可以包含以下一个或者多个值(当flags值为空的时候,默认替换第一次匹配):

● n: 一个数字(取值范围1-512),表明仅替换前n个被pattern匹配的内容;

● g: 表示全局替换,替换所有被pattern匹配的内容;

● p: 仅当行被pattern匹配时,打印模式空间的内容;

● w file:仅当行被pattern匹配时,将模式空间的内容输出到文件file中;

当替换命令中pattern和地址相同时,可以省略pattern中的内容,例如:

sed '/substitute command/{s//&("s")/;s/^/+ /}'paragraph.txt

其中&表示之前匹配的内容。

replacement中的几个特殊元字符:


● &: 被pattern匹配的内容;

●\num: 被pattern匹配的第num个分组(正则表达式中的概念,..  括起来的部分称为分组;

●\: 转义符号,用来转义&,\, 回车等符号

取下一行命令n:

n命令为将下一行的内容提前读入,并且将之前读入的行(在模式空间中的行)输出到屏幕,然后后续的命令会应用到新读入的行上。



高级命令:

读下一行N:

N命令将下一行的内容读取到当前模式空间,但是同n命令不一样的地方是N命令并没有直接输出当前模式空间中的行,而是把下一行追加到当前模式空间,两行之间用回车符\n连接。

删除行D:

该命令删除模式空间中第一行的内容,而它对应的小d命令删除模式空间的所有内容。D不会导致读入新行,相反它会回到最初的编辑命令,重要应用在模式空间剩余的内容上。

打印行P:

P命令与p命令一样是打印模式空间的内容,不同的是前者仅打印模式空间的第一行内容,而后者是打印所有的内容。


保持空间:
保持空间用于保持模式空间的内容,所以模式空间的内容可以复制到保持空间,保持空间的内容也可以复制到模式空间。
操作保持空间的命令如下所示:
名称命令说明
保存(Hold)h/H将模式空间的内容复制或者追加到保持空间
取回(Get)g/G将保持空间的内容复制或者追加到模式空间
交换(Exchange)x交换模式空间和保持空间的内容
保存命令和取回命令都有大写和小写之分,小写的命令会覆盖目标空间的内容,大写命令会将内容追加到目标空间,以\n连接。

流程控制:
一般情况下,sed是将编辑命令从上到下依次应用到读入的行上,但是像d/n/D/N命令都能够在一定程度上改变默认的执行流程,甚至利用N/D/P三个命令可以形成一个强大的循环处理流程。除此之外,其实sed还提供了分支命令(b)和测试(test)两个命令来控制流程,这两个命令可以跳转到指定的标签(label)位置继续执行命令。标签是以冒号开头的标记,例如:
:top
command1
command2
/pattern/b top
command3
如果b指令不指定标签,则匹配默认跳到结尾
test指令:当前仅当当前行发生成功的替换时才会执行跳转

2016.10.14更新:

options包括:
-n:抑制输出
-e:在指令列模式上进行sed
-f:将sed的动作写入到文件,-f filename
-i:直接修改读取的文件内容,不由屏幕输出
-r:支持扩展正则表达式





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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值