设为首页 收藏本站
查看: 817|回复: 0

[经验分享] Linux:sed工具

[复制链接]

尚未签到

发表于 2018-5-20 10:47:27 | 显示全部楼层 |阅读模式
  1.什么是sed工具
       sed意为流编辑器(Stream Editor),在Shell脚本和Makefile中作为过滤器使用非常普遍,也
  就是 把前一个程序的输出引入sed的输入,经过一系列编辑命令转换为另一种格式输出。sed
  和vi都源于 早期UNIX的ed工具,所以很多sed命令和vi的末行命令是相同的。
  sed命令行的基本格式为:
  sed option 'script' file1 file2 ...
  sed option -f scriptfile file1 file2 ...
      sed处理的文件既可以由标准输入重定向得到,也可以当命令行参数传入,命令行参数可以
  一次传入多个文件,sed会依次处理。sed的编辑命令可以直接当命令行参数传入,也可以写成一个脚本文件然后用-f参数指定,编辑命令的格式为
  /pattern/action
      其中pattern是正则表达式,action是编辑操作。sed程序一行一行读出待处理文件,如果某一行与pattern匹配,则执行相应的action,如果一条命令没有pattern而只有action,这个action将作用于待处理文件的每一行。
      sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;
  

  -------------------------------------------------------------------------------------------
  

  2.sed的基本使用:
  

  在sed中,跟我们的工具原理一样,存在着-'x',各种选项,还存在在action中的格式命令
  

  首先我们来看一下基本的:
  7. 命令和选项
  sed命令告诉sed如何处理由地址指定的各输入行,如果没有指定地址则处理所有的输入行。
  命令
  a\ :在当前行后添加一行或多行。多行时除最后一行外,每行末尾需用“\”续行
  c\ :用此符号后的新文本替换当前行中的文本。多行时除最后一行外,每行末尾需用”\"续行
  i\ :在当前行之前插入文本。多行时除最后一行外,每行末尾需用”\"续行
  d :删除模式空间多行,并读取下一行(1)
  D:删除模式空间多行中的一行,不读取下一行(1)
  h : 把模式空间里的内容复制到暂存缓冲区(后面说(1))
  H :把模式空间里的内容追加到暂存缓冲区(1)
  g :把暂存缓冲区里的内容复制到模式空间,覆盖原有的内容(1)
  G:把暂存缓冲区的内容追加到模式空间里,追加在原有内容的后面(1)
  l :列出非打印字符
  p :打印行
  n :读入下一输入行,并从下一条命令而不是第一条命令开始对其的处理
  q :结束或退出sed
  r :从文件中读取输入行
  ! : 对所选行以外的所有行应用命令
  s :用一个字符串替换另一个
  g :在行内进行全局替换
  w :将所选的行写入文件
  x :交换暂存缓冲区与模式空间的内容(1)
  y :将字符替换为另一字符(不能对正则表达式使用y命令)
  

  其中,sed在支持这些action选项之外,同样也支持在grep工具中的字符限定符,位置限定符,数量限定符:
      关于限定符的话可以查看我的上一篇客:http://memory73.blog.51cto.com/10530560/1792687
      与grep一样,sed也支持特殊元字符,来进行模式查找、替换。不同的是,sed使用的正则表达式是括在斜杠线"/"之间的模式。
      如果要把正则表达式分隔符"/"改为另一个字符,比如o,只要在这个字符前加一个反斜线,在字符后跟上正则表达式,再跟上这个字符即可。
  例如:sed -n '\o^Myop' datafile
  当然了,还需要提醒的一点就是sed工具是基于basic模式,所以对于?+{}|()这几个字符他是取得字面意思,当我们需要使用他的特殊含义时,我们需要在前面加上\
  

  下面我们就简单使用一下sed工具:

  1. /pattern/p :打印匹配pattern的行
  使用p命令需要注意,sed是把待处理文件的内容连同处理结果一起输出到标准输出的,因此
  p命令 表示除了把文件内容打印出来之外还额外打印一遍匹配pattern的行。比如一个文
  件log的内容是
  要想只输出处理结果,应加上-n选项,这种用法相当于grep命令
DSC0000.png

DSC0001.png

  3. /pattern/s/pattern1/pattern2/:查找符合pattern的行,将该行第一个匹配
  pattern1的字符串替换为pattern2
  4. /pattern/s/pattern1/pattern2/g:查找符合pattern的行,将该行所有匹配
  pattern1的字符串替换为pattern2
DSC0002.png DSC0003.png

  pattern2中的&表示原文件的当前行中与pattern1相匹配的字符串
  

  /pattern/d :删除匹配pattern的行
  注意,sed命令不会修改原文件,删除命令只表示某些行不打印输出,而不是从原文件中删去。
DSC0004.png

  

  其中,()可以将一个正则集合成一个单元。
  pattern2中的\1表示与pattern1的第一个()括号相匹配的内容,\2表示与pattern1的
  第二个()括号 相匹配的内容。sed默认使用Basic正则表达式规范,如果指定了-r选项则使
  用Extended规范,那么()括号就不必转义了。
  

  如果需要改变源文件,就使用sed -i : 做的操作会修改原文件
  

  
  定址
  定址用于决定对哪些行进行编辑。地址的形式可以是数字、正则表达式、或二者的结合。
  如果没有指定地址,sed将处理输入文件的所有行。
  sed -n ‘3p’ file #打印第三行
  sed -n ‘100,300p’ file #打印100~300行的信息(包括100和300)
  地址是逗号分隔的,那么需要处理的地址是这两行之间的范围(包括这两行在内)。范
  围可以用数字、正则表达式、或二者的组合表示。
  sed ‘2,5d’ file #删除第二行到第五行
  sed ‘/start/ ,/end/d’ file #删除包含’start’行和’end’行之间的行
  sed ‘/start/, 10d’ file #删除包含’start’ 的行到第十行的内容
  
关于其中正则表达式的使用grep那篇博客中有讲解,这里就不在多说了。

  

  下面我们来说一下关于sed的高级用法。
      在上面如果有细心的读者就会发现我在命令后面加了(1)这个备注,并且这些命令都提到了一个保持空间的概念,这些命令都是针对保持空间的。

      sed在正常情况下,将处理的行读入模式空间(pattern space),脚本中的“sedcommand(sed命令)”就一条接着一条进行处理,知道脚本执行完毕。然后该行输出,模式(pattern space)被清空;接着,在重复执行刚才的动作,文件中的新的一行被读入,直到文件处理完毕。
  文件最后不存在空行的话是没有换行符的
   DSC0005.png
  
  一般情况下,数据的处理只使用模式空间(pattern space),按照如上的逻辑即可
  完成主要任务。但是某些时候,使用通过使用保持空间(hold space),还可以带
  来意想不到的效果。
  模式空间:可以想成工程里面的流水线,数据之间在它上面进行处理。
  保持空间:可以想象成仓库,我们在进行数据处理的时候,作为数据的暂存区域。
  正常情况下,如果不显示使用某些高级命令,保持空间不会使用到!
  其实很多的东西都有用到2个存储空间的临时概念,简单的算法计算题用到的2个存储结构,还有git中的临时仓库,还有数据库中的事务仓库都是很相似的理解。
  sed命令:
  + 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后
  + d:[address[,address]]d 删除pattern中的所有行,并读入下一新行到
  pattern中
  + D:[address[,address]]D 删除multiline pattern中的第一行,不读入下一行
  + x:交换保持空间和模式空间的内容
  + n:读取patten中的下一行copy到保持空间
  + N:读取patten中的下一行追加到保持空间
  其中大写都是追加,小写都是覆盖。
  见如下例子:

  •   给每行结尾添加一行空行
      

DSC0006.png

  2.用sed模拟出tac的功能(倒序输出)
DSC0007.png

  1!G第1行不执行“G”命令,从第2行开始执行。$!d,最后一行不删除(保留最后1行)
  过程解析:
DSC0008.png

  

  3.追加匹配行到文件结尾 DSC0009.png
DSC00010.png

  去掉追加中间的空行:
      sed -e 'hello/H;1h' -e '$G' file1

DSC00011.png

  

  4.行列转化
DSC00012.png

  H表示把pattern space 的内容追加到hold space中去,H可以带一个地址,这里
  用的是$,表示到文件的末尾,然后用x将之取到pattern space中,把\n替换成空格
  再打印即可。
  

  

  5.1-100的求和 DSC00013.png
  

  

  6.打印奇偶数行
DSC00014.png

  

  

  7.:再次求1-100的求和 DSC00015.png
  
  :a表示标签a,ba表示跳转到a标签,$表示最后一行,!表示不做后续操作,所以,$!ba表示最后一行不用跳转到a标签,结束此次操作。
  


  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-463248-1-1.html 上篇帖子: linux +SQL 安装 下篇帖子: linux shell中的eval
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表