Linux文本处理三剑客之sed

Linux文本处理三剑客之sed

sed介绍

  • sed - Stream EDitor,行编辑器
  • sed是一种流编辑器,一次处理一行内容,处理时把当前处理的行临时存储在一个缓冲区,称为“模式空间(pattern space)”,然后sed命令处理缓冲区的内容,处理完成之后,把缓冲区的内容打印至当前终端,然后读入下一行,执行下一循环。若没有高级编辑命令,那么两个循环之间清空模式空间,这样不断重复直至文件末尾。但是若有使用高级编辑命令,就会引入sed的另一个空间,称为“保持空间”(hold space),保持空间中存储可能是模式空间未处理完的内容。这样就涉及两个空间内容的处理,sed直接处理的是模式空间中的内容。
  • 关键词:行处理、遍历整个文件(默认循环)、模式空间、保持空间
  • 功能:主要用来编辑一个或者多个文件,简化对文件的反复操作,编写转换程序等等。(非交互式的批量修改文件、可直接写在脚本中)
  • 参考:http://www.gnu.org/software/sed/manual/sed.html
  • sed的用法(前面介绍的主要用法只涉及模式空间)
    sed option ‘scripts’ inputfile
      1) inputfile:文件或者来自管道的输入
      2) option:
        -n:不输出模式空间内容至屏幕,即关闭自动打印
        -e:支持多点编辑
        -r:支持扩展正则表达式
        -i.bak:备份原文件并在原处编辑文件
        -f /PATH/SCRIPT_FILE:从文件中读取编辑脚本
        -i:编辑原文件

  3) scripts:scripts包含两部分:‘位置和命令’
    a、位置(地址定界)
      ①不给地址:对全文进行处理
      ②单地址:
        #:指定的行,$:最后一行
        /pattern/:被此处模式匹配的行
      ③地址范围:
        #,#:从第#行到第#行
        #,+#:从第#行加其后#行
        /pat1/,/pat2/
        /pat1/,#(混用)
      ④支持~:步进
        1~2:奇数行
        2~2:偶数行

    b、命令(编辑命令)
     d:删除模式空间匹配的行,立即启用下一轮循环
     p:打印当前模式空间中内容,追加至默认输出之后
     a [\]text在指定行后面追加文本,追加多行使用‘ \n ’ ;[\]表示其后内容均为新增内容
     i [\]text 在指定行前面添加文本
     c [\]text 替换指定行文本
     w /path/file:保存模式匹配的行至指定文本
     r /path/file:读取指定的文本至模式空间匹配的行行后
     =:为模式空间中的行打印行号
     !:模式空间中匹配行取反处理

     ★★★★★ sed经常使用的查找替换( 代表现阶段我需要掌握系数)
        ①s///:查找替换,支持使用其他分割符,s@@@,s###
        ②替换标记:
          g:全局替换
          p:显示替换成功的行
          w /PATH/FILE:将替换成功的行保存至指定文件中
          

    c、高级编辑命令(编辑命令) 涉及保存空间
     P: 打印模式空间开端至\n内容,并追加到默认输出之前
     h:把模式空间中的内容覆盖至保存空间
     H:把模式空间中的内容追加至保持空间
     g: 从保持空间取出数据覆盖至模式空间
     G:从保持空间取出内容追加至模式空间
     x: 把模式空间中的内容与保持空间中的内容进行互换
     n: 读取匹配到的行的下一行覆盖至模式空间
     N:读取匹配到的行的下一行追加至模式空间
     d: 删除模式空间中的行
     D:如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本, 并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间不包含换行符,则会像发出d命令那样启动正常的新循环

★★★★★sed可以将一行文本随意切割为多份,可对每一份实现修改

sed练习题1:
1、删除/etc/grub2.cfg中所有以空白开头的行行首的空白字符
sed -nr 's/^[[:space:]]+([^[:space:]].*)/\1/p' /etc/grub2.cfg

2、删除/etc/fstab中所有以#开头,后面至少跟一个空白字符的的行的行首的#和空白字符
sed -nr 's/^#[[:space:]]+//p' /etc/fstab

3、在centos6中/root/install.log每行行首加#号
sed -nr 's/(.*)/#\1/p' /root/install.log

4、在/etc/fstab中不以#开头的行的行首添加#号
sed -nr 's/^[^#](.*)/#\1/p' /etc/fstab 

5、将文本的n和n+1行合并为一行,n为奇数行
seq 10| sed -n '1~2p' |xargs -n2

6、利用sed取出ifconfig命令中的ipv4地址
ifconfig |sed -n '2p'|sed -nr 's/[^0-9]+([0-9.]+).*/\1/p'

7、统计CentOS安装光盘目录下所有RPM文件以.分割的倒数第二个字段的重复次数
[root@centos7 test]# ls /misc/cd/Packages/*.rpm | sed -nr 's/.*\.(.*)\.rpm/\1/p' |sort |uniq -c 
   2258 i686    32位CPU架构(可以在64位操作系统运行的32位程序)
   3122 noarch  与CPU架构无关(二进制程序才与CPU架构相关)
   4639 x86_64  64位CPU架构
...

★★★sed在脚本中使用变量时,其一般’scripts’ 可能导致变量失效,此时可以用三个单引号’’'将变量引起来,以识别scripts中的变量

示例:
    [root@centos7 test]# NAME=root;echo $NAME;sed -n '/$NAME/p' /etc/passwd
    root
    此处变量在单引号内,未能识别是变量
    [root@centos7 test]# NAME=root;echo $NAME;sed -n '/'''$NAME'''/p' /etc/passwd
    root
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    [root@centos7 test]#

sed高级用法

示例:
    sed -n 'n;p' FILE
    sed '1!G;h;$!d' FILE
    sed‘N;D’FILE
    sed '$!N;$!D' FILE
    sed '$!d' FILE
    sed ‘G’ FILE
    sed ‘g’ FILE
    sed ‘/^$/d;G’ FILE
    sed 'n;d' FILE 
    sed -n '1!G;h;$p' FILE

上述示例分析:只分析一个(以此类推):
Linux文本处理三剑客之sed_第1张图片

你可能感兴趣的:(linux文本处理三剑客,sed)