浅析Linux命令之sed

sedStream Editor,流编辑器

1、功能

sed用途非常广泛,主要用来自动编辑一个或者多个文件,以简化对文件的反复操作,可用于:

  • 文本替换
  • 选择性的输出文本文件
  • 从文本文件的某处开始编辑
  • 无交互式地对文本文件进行编辑等
(这些功能在最后的例子中都有体现)

2、工作方式

sed一次处理一行内容,对一行的操作遵循下面的三个阶段:


  • 读取:sed从输入流(文件、管道或者标准输入)中读取一行并且存储到它的临时缓冲区中,称为“模式空间”(pattern space);
  • 执行:默认情况下,所有的sed命令都在 模式空间 中顺序执行,除非指定了行的地址,否则sed命令将会在所有行上依次执行;
  • 显示:发送经sed命令修改后的内容到输出流。在发送数据之后,模式空间将会被清空。
  • 在文件的所有内容被处理完之前,上述过程将会被重复执行。
注意:在这个过程中,所有的sed命令都是在模式空间中执行的,因此输入文件并没有改变,除非你使用重定向存储输出。

3、命令格式

sed可以用两种方式调用:

sed [-n] [-e] 'commands' files  

sed [-n] -f scriptfile files   (例4)

1)第一种在命令行中使用单引号指定要执行的命令commands

2)第二种指定了包含sed命令的脚本文件

4、常用可选项

-n:默认情况下,模式空间中的内容在处理完成后将会打印到标准输出,该选项阻止该行为,只打印模式匹配的行

-e:指定要执行的命令,使用该参数,我们可以指定多个命令

-f:指定包含要执行的命令的脚本文件

5、常用命令

1) d:delete,删除,格式为[address1 [ , address2] ]d  注意:中括号表示可选的意思
例如:(f为文件名)
sed '2, 4 d' f  #删除第2到4行 
sed '4d' f  #删除第4行
sed '/test hello/ d' f  #删除含有test hello的行
sed '/test/ , /hello/ d' f  #删除含有test的行和含有hello的行
2) w:write,写命令,格式为[address1 [, address2]]w file,file指的是存储文件内容的文件名
sed -n 'w book.bak' book.txt  #实现了cp命令,将book.txt的内容复制到book.bak
sed -n '2~2 w f.bak' f  #将f文件的偶数行存储到f.bak中(~的意思看下面的行寻址)
sed -e '/Martin/ w Martin.txt' -e '/Paule/ w Paule.txt' book.txt  #把含有Martin的行存到一个文件,含有Paule的行存到另一个文件
3) a:append,追加命令,格式为[address]a\
例如:
sed '4 a hello world' f  #在第4行后追加一行,内容为hello world
sed '$ a hello world' f  #在文件结尾追加一行hello world
sed '/test/ a hello world'  #在匹配test的行之后加一行hello world
4) c:change,替换命令,格式为[address [,address] ]c\,替换匹配的行的内容
例如:
sed '3 c hello world' f  #将第三行的内容替换为hello world
sed '3,5 c hello world' f  #将第3到5行的内容替换为1行hello world
sed '/test/ c hello world' f  #将含有test的行替换为hello world
5) i:insert,插入命令,格式为[address]i\ ,与追加命令a相似,唯一的区别是插入命令是在匹配的位置前插入新的一行
例如:
sed '4 i hello world' f  #在第四行前插入一行hello world
6) e:执行外部命令:
例如:
sed '3 e date' f  #在第三行之后执行date命令
7) !:排除命令
例如:
sed -n '/test/ !p' f  #输出不含有test的行
8) s:替换命令
待续 

6、行寻址

默认情况下,在sed中使用的命令会作用于文本数据的所有行。如果只想将命令作用于某些特定的行,则需要使用行寻址。sed包含两种方式的行寻址:

1)以数字形式表示的行区间:

例如打印f文件的第3行:p是print打印

sed -n '3p' f

打印文件f的第2到5行(逗号,分隔输出的范围):

sed -n  '2,5 p' f

打印文件f的第一行($表示文件的最后一行):

sed -n '$ p' f

打印文件f的第3行到最后一行:

sed -n '3,$ p' f

打印文件的第二行,以及后面的3行(即第2到5行)(M,+n 表示从第M行以及下面n行):

sed -n '2,+3 p' f  

打印文件的奇数行(m~n表示应该处理m行开始的每n行,例如50~5匹配行号50,55,60,65等):

sed -n '1~2 p' f

2)以文本模式来过滤行:

格式 /pattern/command

必须用正斜线将要指定的pattern封起来,sed编辑器会将该命令作用到包含指定文本模式的行上。

例如:输出所有包含test的行:

sed -n '/test/ p' f

使用逗号,指定匹配多个匹配的模式,例如输出hello和bye之间的所有行:

sed -n '/hello/, /bye/ p' f

输出第一次出现test的行及其后面3行(结合数字寻址):

sed -n '/test/, +3 p' f

7、示例

我们以f文件为示例:

1)sed  '' f  #效果等同于cat f 


2)sed -n '' f  #什么也不显示

3)sed -e '1d' -e '2d' -e '5d' f  #

 

注意此时屏幕输出的已经删除了第1,2,5行,但是并不改变f文件

4)使用echo -e "1d\n2d\n5d\n" > commands #在commands文件中写入1d\n2d\5d

然后执行sed -f commands f,可达到与例3)相同的结果:



参考:http://blog.jobbole.com/109088/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值