zoukankan      html  css  js  c++  java
  • 10 sed命令的基本用法

      grep灵活的关联正则表达式实现文件过滤,而sed是一个数据流的编辑器,或者说是一个行编辑器,它将文件一行一行的数据放入到内存中进行编辑,而awk是一个报告生成器,这个我们以后再说;

      之前我们介绍过grep与正则表达式,这一节我们详细介绍sed的用法

    sed的基本用法

      sed  Stream EDitor 流编辑器,也叫做行编辑器;它是一个字处理器工具【与字处理工具相对应的就是文本编辑器,类似于nona或者vi vim(他们都是文本编辑器,或者说是全屏编辑器)】

      sed并不是直接去处理文件本身,而是将每一行的数据读取到内存中区,再在内存中进行处理,并显示在屏幕上。而内存提供出来处理这个数据的空间我们叫做模式空间

      需要注意的是,sed命令默认不编辑源文件,仅对模式空间中的数据进行修改和处理,然后处理结束后,将模式空间中处理好的数据显示在屏幕上。

    sed命令的用法

      sed [option] ... {script-only-if-no-orther-script} [input-file]

      这里的script-only-if-no-orther-script可以理解为sed命令自己的语言,它有自己独立的语法结构;

      sed [option] 'AddressCommand' file ...

      option  选项类型

        -n  静态模式,不再默认显示模式空间中的内容

        -i  直接修改原文件(这种做法很危险)

        -e  -e Script 表示可以同时执行多个脚本

        -f  /path/to/sed_script 将脚本文件写在其他脚本中,这样就需要通过-f来调用这个脚本文件

        -r  表示可以使用扩展的正则表达式

      Address  表示需要处理的对象的行或者地址

        1、startline,endline

          1,100  #表示处理第一行到第一百行;

          $  表示处理最后一行;

          $-1  表示处理倒数第二行;

        2、也可以指定模式,使用正则表达式 /RegExp/ (例如:/^root/ 表示匹配以root开头的字符)

        3、也可以指定模式:/pattern1/,/pattern2/

          第一次被pattern1匹配到的行开始,至第一次被pattern2匹配到的行结束,这中间所有的行都会被匹配到。

        4、linenumber

          精确指定某行进行匹配

        5、StartLine,+N

          从指定的行开始,到后面的N行,都会被匹配上,总共N+1行;

      Command  指定sed选出来后的行为

        d 表示删除符合条件的行

          sed '1,2d' /etc/fstab

          sed '3,$-1d' /etc/fstab

          sed '/oot/d' /etc/fstab  #删除包含有“oot”字符串的行

          sed '1,+2d' /etc/fstab

          sed '1d' /etc/fstab

        p 表示显示(打印)符合条件的行

          sed '/^//p' /etc/fstab  #打印以 / 开头的行,其中 表示转意符

          sed -n '/^//p' /etc/fstab  #-n表示不再默认显示模式空间中的内容

        a 在匹配到的行后面增添新的内容

          a “string” 这样写表示后面再新增string内容;

          sed '/^//a hello world' /etc/fstab

          sed '/^//a hello world #hello,linux' /etc/fstab  #其中 表示换行符号

        i 在指定的前面添加新的内容,内容为string

          sed '/^//i hello world ' /etc/fstab

        r filename  将指定的文件内容添加到符合条件的行处

          sed '2r /etc/issue' /etc/fstab  #在第二行的地方将文件/etc/issue的内容添加进来

          sed '1,2r /etc/issue' /etc/fstab

        w filename  将指定范围的内容另存为一个指定的文件

          sed '/oot/w /tmp/oot.txt' /etc/fstab  #将包含“oot”字符串的行从新保存至/tmp/oot.txt文件中去

        s 查找并替换相关的内容

          s/pattern/sting/  将pattern匹配到的内容替换为后者string的内容,而pattern是支持正则表达式的;

          默认情况下,s命令只替换每行中第一次被pattern匹配到的字符串,如果想要将所有匹配到的字符串均进行替换,就需要再最后面加上:g 全局替换参数,i 忽略字符大小写参数

          【s命令的分隔符可以使用 / ,同时,也可以换成其他的符号,例如:s@pattern@string@、s#pattern#string#】

          sed 's/oot/OOT/' /etc/fstab

          sed 's/^//#/' /etc/fstab

          sed 's@/@#@' /etc/fstab

          sed 's/l/L/g' /etc/fstab

    sed语句的后向引用

      &  用来匹配前面pattern关联的整个字符串;

          sed 's#l..e#&r#g' sed.txt

          sed 's#(l..e)#1r#g' sed.txt

      但是,在一些情况下必须使用后向引用,而不能使用&符来调用之前的pattern所匹配的内容

    练习

      1、删除/etc/grub.conf文件中的行首的空白符
        sed -r 's@^[[:space:]]+@@g' /etc/grub.conf
      2、替换/etc/inittab文件中“id:3:initdefault:”一行中的,中间任意一个数字,将其替换为5;
        sed 's@(id:)[0-9](:initdefault:)@152@g' /etc/inittab
      3、删除/etc/inittab文件中的空白行;
        sed '/^$/d' /etc/inittab
      4、删除/etc/inittab文件中的开头的#号;
        sed '/^#/d' /etc/inittab
        sed 's@^#@@g' /etc/inittab
      5、删除/etc/inittab文件中的开头的#号,但要求#号后面必须有空白字符;
        sed -r 's@^#[[:space:]]+@@' /etc/inittab
      6、删除某文件中以空白字符后面跟了#类的行中的开头的空白字符及#号;
        sed -r 's@^[[:space:]]+#@@g' /etc/inittab
      5、取出一个文件路径的目录名称;
        echo "/etc/rc.d" | sed -r 's@^(/.*/)[^/]+/?@1@g'
  • 相关阅读:
    Elasticsearch嵌套聚合
    Elasticsearch+Logstash+Kibana教程
    《胡雪岩·灯火楼台》—— 读后总结
    Elasticsearch使用REST API实现全文检索
    Elasticsearch集群配置以及REST API使用
    《Node web开发》笔记
    我的第一个Node web程序
    Spring boot整合shiro权限管理
    SpringBoot 整合Shiro 一指禅
    SpringBoot,用200行代码完成一个一二级分布式缓存
  • 原文地址:https://www.cnblogs.com/BurnovBlog/p/10395073.html
Copyright © 2011-2022 走看看