文本处理三剑客之 Sed

     Sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(
pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变
,除非你使用重定向存储输出。Sed主要用来自动编辑一
个或多个文件,简化对文件的反复操作,编写转换程序等。

   下面来说说它的用法:

sed [option]… ‘script’ inputfile

sed:
   -n:取消自动打印,输出到屏幕。
   -e: 多点编辑,对每行处理时,可以有多个Script 即可以跟多个命令。
   -f: 把Script写到文件当中,在执行sed时-f 指定文件路径,如果是多个Script,换行写
   -r: 支持扩展的正则表达式
   -i: 直接将处理的结果写入文件
    -i.bak  在将处理的结果写入文件之前先备份
script
   地址定界:
     (1) 不给地址:对全文进行处理
         如:sed -n ‘p’ 文件
     (2) 单地址:
         #: 指定的行
         如:sed -n ‘2p’ 文件
         /pattern/:被此处模式所能够匹配到的每一行
         如:sed -n ‘/linux/p’文件
     (3) 地址范围:
         #,#
         如:sed -n ‘2,3p’
         #,+#
         如: sed -n ‘2,+1p’
         /pat1/,/pat2/
         如: sed -n ‘/redhat/,/linux/p’
         #,/pat1/
         如:sed -n ‘2,/linux/p’
     (4) ~:步进

         1~2 奇数行

         2~2 偶数行
         如:sed -n ‘1~2p’  只打印奇数行
            sed -n ‘2~2p’  只打印偶数行

 

      编辑命令:

      d: 删除模式空间匹配的行,并立即启用下一轮循环
         如:sed ‘2d’ /etc/passwd (删除/etc/passwd文件中的第二行)
      p:打印当前模式空间内容,追加到默认输出之后
         如:sed ‘2p’ /etc/passwd 
      a [\]text:在指定行后面追加文本,支持使用\n实现多行追加

         如:sed ‘2a\123\n456\n789 /etc/passwd 

      i [\]text:在行前面插入文本

         如:sed ‘2i\123\n456\n789’ /etc/passwd  

      c [\]text:替换行为单行或多行文本
         sed ‘2c\123\n456\n789’ /etc/passwd
      w /path/somefile: 保存模式匹配的行至指定文件
         如:sed -n ‘3w /root/3.file’ /root/bin
      r /path/somefile:读取指定文件的文本至模式空间中匹配到的行后
         sed ‘3r /root/mage.txt’ /etc/passwd
      =: 为模式空间中的行打印行号
         sed ‘=’ /etc/fstab 
      !:模式空间中匹配行取反处理
         sed -n ‘2!p’ /etc/fstab

      s///:查找替换,支持使用其它分隔符,s@@@,s###替换标记。

         如:sed -n ‘s/root/rooter/g’ /etc/passwd
      g: 行内全局替换

         如:sed ‘s/root/rooter/g’ /etc/passwd 

      p: 显示替换成功的行

         如:sed -n ‘s/root/rooter/gp’ /etc/passwd 
      w /PATH/TO/SOMEFILE:将替换成功的行保存至文件中

  高级编辑命令:

      h: 把模式空间中的内容覆盖至保持空间中
      H:把模式空间中的内容追加至保持空间中
      g: 从保持空间取出数据覆盖至模式空间
      G:从保持空间取出内容追加至模式空间
      x: 把模式空间中的内容与保持空间中的内容进行互换
      n: 读取匹配到的行的下一行覆盖至模式空间
      N:读取匹配到的行的下一行追加至模式空间
      d: 删除模式空间中的行
      D:删除当前模式空间开端至\n的内容(不再传至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed

   示例:

       sed -n ‘n;p’ FILE  显示偶数行
       sed ‘1!G;h;$!d’ FILE  倒序显示
       sed -n ‘1!G;h;$p’ 倒序显示
       seq 7 |sed ‘n;d’ 显示奇数
       sed  ‘N;D’ 显示最后一行
       sed ‘$!d’  显示最后一行
       sed ‘G’  每行之间加空行 
       sed ‘g’  把每行内容替换成空行
       sed ‘/^$/d;G’  确保每一行下面都有一个空行

 

小试牛刀:

1.删除centos7系统/etc/grub2.cfg文件中所有以空白开头的行行首的空白字符
  cat grub2.cfg |sed -nr ‘s/^[[:space:]]+//p’

文本处理三剑客之 Sed

文本处理三剑客之 Sed

(注:这里因为事先拷贝了一份grub2.cfg文件,所以直接cat grub2.cfg了,后面的题的文件也是事先复制过的。不再重申)截图只是一部分,只要大家明白意思即可。这里用到扩展正则表达式,所以需要参数-r,-n表示不打印文件内容到屏幕,p表示打印出作用过的行,即改变过的行被显示出来。

2.删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符
 (1)sed -r “/^#[[:space:]]/s/^#[[:space:]]+([^[:space:]])/\1/” fstab

 (2)sed -r ‘s/^#[[:space:]]+//’ fstab

文本处理三剑客之 Sed

上面的命令可能不是太好看出来到底输入的命令是执行了还是没执行,那下面的命令加上了-n , p 是不是一目了然了呢文本处理三剑客之 Sed(对了,我介绍的是(2),至于(1)呢留给你们自己试验吧啊。文本处理三剑客之 Sed我就是故意把烧脑的留给你们的,怎么滴吧,哈哈~)

3.在centos6系统/root/install.log每一行行首增加#号
  sed ‘s/^/#/g’ /root/install.log

文本处理三剑客之 Sed

有没有很简单?起初看到题,还以为是什么高深的题,纠结了半天最后跳过了,看到演示后,知道真相的我眼泪掉下来文本处理三剑客之 Sed,什么鬼,就是个这?一个表示开头的^,一个被加上的#。有句话叫“你认为的困难都不是困难”,应不应景?文本处理三剑客之 Sed仰天哀嚎一声……

4.在/etc/fstab文件中不以#开头的行的行首增加#号
  cat fstab |sed  ‘s/^[^#]/#&/’

文本处理三剑客之 Sed

没有对比就没有伤害,当然这里没有对比就没有一目了然文本处理三剑客之 Sed。那你说后面的&是啥玩意,不要可以么?如果你够任性,没什么不可以文本处理三剑客之 Sed。下面来说说&干什么的,还记得讲vim时,有这样一句话么【替换为的内容:不能使用模式,但可以使用\1, \2, …等后向引用符号;还可以使用“&”引用前面查找时查找到的整个内容】所以s/^[^#]/#&/就成了在不以#号开头的行的行首加上#号。是不是似懂非懂,没关系多看几遍消化消化。想当初我也是一脸懵逼的看着人家操作的。文本处理三剑客之 Sed说多了都是泪,你们先看,我去倒到眼里的水再回来,see you.

原创文章,作者:吼吼哈嘿,如若转载,请注明出处:http://www.178linux.com/85396

(0)
吼吼哈嘿吼吼哈嘿
上一篇 2017-08-26
下一篇 2017-08-26

相关推荐

  • 设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)

    1.概述 在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责,即将行为分布到各个对象中。 对于一个模块或者系统,可能由很多对象构成,而且这些对象之间可能存在相互的引用,在最坏的情况下,每一个对象都知道其他所有的对象,这无疑复杂化了对象之间的联系。虽然将一个系统分割成许多对象通常可以增强可复用性,但是对象…

    Linux干货 2015-07-20
  • 数组

    一.数组 变量:存储单个元素的内存空间 数组:存储多个元素的连续的内存空间,相当于多个变量的集合。 索引:编号从0 开始,属于数值索引  注:索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash4.0 版本之后开始支持,bash 的数组支持稀疏格式(索引不连续) 二.数组的声明 declare -a ARRAY_NAME decla…

    Linux干货 2016-11-23
  • 为什么新建文件时,所在文件系统还有大量剩余空间,却提示此文件系统空间已满??

    一:答疑解惑:    这是因为该文件所在分区的inode号被用尽,虽然分区的剩余容量还有很多。 二:基本原理:   inode为何物block又为何物?以及,inode都有哪些特征?   ①我们知道,在linux文件系统中,文件名只是计算机用来给人看,而计算机本身只识别文件所对应的数字或编号,而这个编号或数字…

    2017-07-22
  • rpm数据库损坏 不能使用正常使用yum的处理方法

           不知道有没有跟我一样的小伙伴,在使用yum安装软件时,发现无法正常使用yum安装软件包,下面出现几句英语提示。在使用rpm时也无法正常的使用。其实 是rpm数据库崩溃导致的 下面就简单的介绍一下怎么回复,让其正常的工作,很简单几个命了即可。 1. 出现错误提示,这时我们需要认真的阅读下面的提示,不要乱找原…

    Linux干货 2017-06-13
  • 初学Linux之快速获取帮助

    Windows操作系统和Linux操作系统的界面区别,导致了初学Linux时,我们会遇到比较大的障碍。Windows操作系统时图形这种形象化的操作界面,而Linux则不同,时以字符界面为主的。当我们遇到困难,我们可以获取系统提供的帮助信息,越过我们遇到的障碍,快速的熟悉Linux。获取帮助的方法包括:Linux手册(man),命令的帮助页,info帮助。

    2017-11-19
  • 第十八周作业

    1、为LNMP架构添加memcached支持,并完成对缓存效果的测试报告; 环境准备: 1)LNMP(php-fpm)环境已搭建完毕 2)Wordpress已部署完成 1.在memcache服务器上安装memcached包并启动服务 ]# yum install memcached -y ]# systemctl start memcached.servic…

    2017-06-22