zoukankan      html  css  js  c++  java
  • sed命令详解

    sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。

    然后读入下一行,执行下一个循环。这样不断重复,直到文件最后。文件内容并没有改变,除非使用重定向存储输出。

    sed语法:sed [option]……'script' inputfile……

    常用选项:

    -n  #不输出模式空间内容到屏幕,即不自动打印到屏幕

    -e  #多点编辑

    -f  /PATH/SCRIPT_FILE  #从指定文件中读取编辑脚本

    -r  #支持扩展的正则表达式

    -i.bak  #备份文件并原处编辑,.bak可以自定义

    一、script,地址命令

    地址定界:

    1、不给地址,则对全文进行处理

    2、单地址:n:指定的行,$:最后一行

      /pattern/:被此处模式所能匹配到的每一行

    3、地址范围

      n1,n2  #意思为文本的n1行到n2行

      n,+m  #意思为显示n行,以及其后面的m行

      /pat1/,/part2/  #从匹配到pat1的行到part2的行

      n,/pat1/  #从n行开始,到pat1行结束

    4、~:步进

      1~2  #奇数行

      2~2  #偶数行

    举例:打印指定行的内容到屏幕

    执行命令:sed -n 'p' fstab #后面的p是指将匹配到前面的地址的内容打印到屏幕,这里前面的地址范围为空,则表示匹配文件所有的行

     执行命令:sed -n '2,3p' fstab  #只打印第2行到第3行的内容到屏幕

     执行命令: sed -n '6,$p' fstab  #只打印出第6行到文本最后一行得内容

     执行命令:sed -n '/^#/p' fstab    #匹配/ /中的模式,打印出以#开头的行

     

     执行命令:sed -n '2,//dev/disk/p' fstab  #打印第二行到包含/dev/disk的行的所有内容

    执行命令:sed -n '//etc/fstab/,/xfs/p' fstab  #打印出从包含/etc/fstab的行到包含xfs的行的内容

    执行命令:sed -n '1~2p' fstab  #打印出文档中的奇数行

    执行命令:sed -n '2~2p' fstab  #打印出文本的偶数行

    二、sed的编辑命令

    d  #删除模式空间匹配的行,并开启下一轮循环

    p  #打印出模式匹配的行,追加到默认输出的后面

    a []text  #在指定的行后面追加一行,支持使用 追加多行

    i []text  #在指定的行前面追加一行,支持使用 追加多行

    c []text  #替换行为单行或多行文本

    w /path/file  #保存模式匹配的行至指定文件

    r /path/file  #读取指定文件的文本至模式空间中匹配到的行的行后

    =  #为模式空间中的行打印行号

    !  #模式空间中匹配行取反处理

    举例:打印出除/dev/mapper所在行的所有行

    执行命令:sed -n '//dev/mapper/d;p' fstab  #删除模式匹配到的行,然后打印出来,中间;表示执行完第一个命令后执行第二个命令

     执行命令:sed '3p' fstab  #没有加n意思为打印出所以的文本,将第三行的内容追加到第三行后面

    执行命令:sed  '/^UUID/a his is a test' fstab  #在UUID后面追加一行文本,this is a test

     执行命令:sed  '/^UUID/i his is a test' fstab  #在匹配的行的前面追加一行文本

    执行命令:sed  '/^UUID/c his is a test a test' fstab  #将匹配到的行替换为指定的文本内容, 意为换行

    执行命令:sed -n '/^UUID/w/root/fstab1' fstab

     执行命令:sed '/UUID/r/root/zhuijia' fstab  #将/root/zhuijia中的内容追加到匹配到的行的后面

    执行命令:sed -n '/UUID/=' fstab      #打印出含有该字符的行的行号

    执行命令:sed -n '/UUID/!p' fstab  #打印除匹配到的行以外的所有的行

    三、sed工具

    s///  #查找替换,支持使用s@@@或者s###

      g  #行内全局替换

      p  #显示替换成功的行

      w /path/file  #将替换成功的行保存至文件中

    举例:将fstab文件中的#全部去掉,然后打印出来

    执行命令:sed -nr 's/# *//g;p' fstab  #将所有的#且后面至少有一个空格的内容替换成无,然后选择所有行,并打印出来

    举例:取出UUID=后面的那一串数字,并打印出来

    执行命令:sed -nr 's/UUID=(*) /boot*/1/p' fstab  #利用正则的分组,将等号后面的内容取出并打印

    四、sed高级应用

    P  #打印模式空间开端至 内容(即模式空间第一行内容),并追加到默认输出之前

    h  #把模式空间中的内容覆盖至保持空间中

    H  #把模式空间中的内容追加至保持空间中

    g  #从保持空间取出数据覆盖至模式空间

    G  #从保持空间取出内容追加至模式空间

    x  #把模式空间中的内容与保持空间中的内容进行互换

    n  #读取匹配到的行的下一行覆盖至模式空间

    N  #读取匹配到的行的下一行追加至模式空间

    d  #删除模式空间中的行

    D  #如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的输入行,而使

       用合成的模式空间重新启动循环。如模式空间不包含换行符,则会像发出d命令那样启动正常的新的循环。

    保持空间:即在sed处理数据时,数据的一个暂存空间,sed默认是处理完一行的数据后,就清空模式空间的内容,继续进行下一一行的数据处理,保持空间则能暂时的存放数据。

    举例:打印文本的偶数行内容

    执行命令:sed -n 'n;p' num

     sed的处理过程:

    sed第一次取数据到模式空间时,因为有n参数,所以sed就把第二行的数据取出并覆盖到模式空间中,此时模式空间就只有第二行数据,然后执行p操作打印

    sed第二次取数据时,由于第二行数据已经取过了,所以从第三行开始取,取的时候,仍然受到n参数影响,所以sed把第四行的数据取出放到了模式空间中,并打印。

    sed的后续也是按照上面的那种方法取出数据,所以sed取出的数据应该依次为:第二行数据、第四行数据、第六行数据……即文本的所有偶数行,然后通过p选项打印到屏幕

    举例:倒序显示文本内容

    执行命令:sed '1!G;h;$!d' num

    sed工作过程:

    sed第一次取数据:运行1!G时,由于是第一行,所以不需要执行G操作,然后在执行h操作,即将第一行数据覆盖到保持空间中,然后删除模式空间中的行。

             此时模式空间中为空,保持空间中为第一行数据

    sed第二次取数据:由于是非首行,执行G操作,将保持空间中的第一行取出追加到模式空间的的第二行的后面,再执行h操作,将第一行第二行复制到保

              持空间中,并删除模式空间的内容,此时模式空间为空,保持数据为第二行和第一行

    如上执行过程,直到遇到了最后一行,将保持空间中的数据第9、8、、6、5、4、3、2、1行追加到模式空间中,由于是最后一行,不执行d动作,此时的

    模式空间中数据为:第10、9、8、7、6、5、4、3、2、1行,由于sed默认打印出所有处理过的行,而之前的操作模式空间都为空,所以不打印,到了最

    后一行,将模式空间中的数据打印出来。

    举例:打印出文本的最后一行

    执行命令:sed 'N;D' num

     sed工作过程:

    sed第一次取数据:读取第一行,然后执行N操作,将第二行的数据追加到模式空间,而后执行D操作,由于模式空间中有换行符,删除模式空间的第一行,即

              模式空间中的数据为第二行。

    sed第二次取数据:读取第由于第二行已经被取过了,这里取第三行,同上删除第一行,模式空间中的数据为第四行

    在此合成的模式空间启动循环,直至再也没有新的行读入,模式空间中就只有最后一行数据。然后打印到屏幕。

  • 相关阅读:
    使用 yo 命令行向导给 SAP UI5 应用添加一个新的视图
    SAP Fiori Elements 应用的 manifest.json 文件运行时如何被解析的
    SAP UI5 标准应用的多语言支持
    微软 Excel 365 里如何设置下拉菜单和自动高亮成指定颜色
    SAP Fiori Elements 应用里的 Title 显示的内容是从哪里来的
    本地开发好的 SAP Fiori Elements 应用,如何部署到 ABAP 服务器上?
    如何在 Cypress 测试代码中屏蔽(Suppress)来自应用代码报出的错误消息
    教你一招:让集群慢节点无处可藏
    应用架构步入“无服务器”时代 Serverless技术迎来新发展
    MySQL数据库事务隔离性的实现
  • 原文地址:https://www.cnblogs.com/awanderer/p/12196030.html
Copyright © 2011-2022 走看看