加载中…
个人资料
Ying
Ying
  • 博客等级:
  • 博客积分:0
  • 博客访问:44,835
  • 关注人气:5
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
相关博文
推荐博文
谁看过这篇博文
加载中…
正文 字体大小:

UNIX SED之一:SED简介

(2014-07-10 10:15:53)
标签:

sed语法

sed原理

分类: UNIX/LINUX

sed是什么:

sed是一个非交互式的流编辑器(stream editor)。所谓非交互式,是指使用sed只能在命令行下输入编辑命令来编辑文本,然后在屏幕上查看输出;而所谓流编辑器,是指sed每次只从文件(或输入)读入一行,然后对该行进行指定的处理,并将结果输出到屏幕(除非取消了屏幕输出又没有显式地使用打印命令),接着读入下一行。整个文件像流水一样被逐行处理然后逐行输出。(via Walk in Mindfields  )

 

sed工作机制:

sed维护两个缓冲区,pattern space和hold space,命令开始执行之前都为空。

pattern space缓冲区用于临时保存每次读取的一行的内容,大部分的匹配和替换等等操作都是针对pattern space中的内容进行的,因此不会对输入文件有任何影响,而hold space则作为后备缓冲区使用,除非指定了一些特殊的命令(例如D删除命令),否则pattern space中的内容会在处理完一行之后清空,但hold space中的内容在处理完每一行时不会被删除。

也就是说pattern space相当于我们的内存,hold space相当于硬盘.处理的时候在内存里,处理过的就放回硬盘.(这是我的理解,有一点点不恰当,但是因此一些概念会比较好理解.)

具体来说,可以大致分为以下几步:

1.首先,从标准输入流读取一行,移除换行符,然后存入pattern space中

2.执行指定的命令,(每个命令都有一个可选的地址(可以是行号,也可能是一个正则表达式匹配),这个地址作为一个执行命令前的测试,指定了需要对哪些行进行操作。当前行只有匹配的情况下才会执行命令。)

3.当指定所有的命令都执行完了之后,pattern space内容就被处理过了,sed默认会将pattern space中的内容打印到标准输出中,移除的换行符也会打印出来。本行操作完成。

4.然后sed会读取下一行的内容,再次执行相同的操作。直到行尾。

sed语法:

sed [-n] 'editing command' [file ...]   #对行执行一个编辑命令

sed [-n] -e 'editing command' ... [file ...] #对每行执行多个编辑命令

sed [-n] -f 'script file' [file ...] #对每行执行多个编辑命令

sed读取每个输入文件的每一行。没有文件的话,则表示标准输入或者管道。sed会对每一行执行编辑命令(editing command).默认状态下,结果会打印到标准输出。若无-e 或-f选项,sed会把第一个参数看作是要使用编辑命令。

基本sed编辑命令:
        打印匹配行                      c\    用新文本替换定位文本
        显示文件行号                        使用替换模式替换相应模式
    a\     在定位行号后附加新文本信息           从另一个文本中读文本
    i\     在定位行号后插入新文本信息           写文本到一个文件
        删除定位行                         第一个模式匹配完成后退出或立即退出
        显示与八进制ASCII代码等价的控制字符        传送字符
        从另一个文本中读文本下一行,并附加在下一行   {}     在定位行执行的命令组
        globle, 作用于匹配行上的所有匹配。默认状态下,仅仅作用于
 该行的第一个匹配

使用sed在文本中定位文本的方式(匹配特定行):

  • 最后一行,例如:

sed -n '$p' temp.txt #打印文件的最后一行

注:$指文件的最后一行(若在正则表达式里则表示行结束)。对sed而言,指的是输入数据的最后以行。即便是处理多个文件,sed也将它们视为一个长的输入流,且$只应用到最后一个文件的最后一行(GNU的sed有个选项可使地址分开地应用到每个文件)。

  • 使用行编号,例如:

       sed -n '2p' temp.txt   #只显示第2行

  • 正则表达

    /pattern/    查询包含模式的行,例如:

       sed -n 's/a/A/pg' temp.txt #将每行中的没有a替换成A

注:g表示替换替换该行中的所有匹配,若没有g,则只替换第一个匹配。

  • 范围
    • x,y :    表示行号范围从x到y,例如:

sed -n '2,5p' temp.txt #打印文件的第2行到第5行

  • /pattern1/,/pattern2/  :从含有pattern1的行开始,到含有pattern2的行,例如
    sed '/foo/,/bar/ s/a/A/g' temp.txt

注:从含有food的行开始,到含有bar的行,将该范围内的行中的所有(命令g)a替换成A

  •  /pattern/,x   从含有pattern的行开始,到第x行
     x,/pattern 从第x行开始,到含有pattern的匹配行
  •   不包含上述范围的行,在上述范围后加!,例如:

sed '/foo/!s/a/A/g' temp.txt #将不含foo的每行里的所有a替换成A

sed '1,3!s/a/A/g' temp.txt #将除1到3行外的每行里的所有a替换成A

:!之后没有空格,否则命令不能被识别。

 

部分转载自:Unix sed实用教程开篇

0

阅读 评论 收藏 转载 喜欢 打印举报/Report
  • 评论加载中,请稍候...
发评论

    发评论

    以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

      

    新浪BLOG意见反馈留言板 电话:4000520066 提示音后按1键(按当地市话标准计费) 欢迎批评指正

    新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

    新浪公司 版权所有