文本处理工具sed

处理文本的工具sed

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

sed

用法:
    sed [option]... 'script' inputfile...
    
常用选项:
    -n :不输出模式空间内容的自动打印
    -e:  多点编辑
        
        [root@localhost ~]# sed -e '2,10d' -e '/rpc/,/rooter/d' f1
        root:x:0:0:root:/root:/bin/bash
        games:x:12:100:games:/usr/games:/sbin/nologin
        ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
        nobody:x:99:99:Nobody:/:/sbin/nologin
        avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
        systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin
        systemd-network:x:998:996:systemd Network Management:/:/sbin/nologin
        dbus:x:81:81:System message bus:/:/sbin/nologin
        polkitd:x:997:995:User for polkitd:/:/sbin/nologin
        abrt:x:173:173::/etc/abrt:/sbin/nologin
        colord:x:996:994:User for colord:/var/lib/colord:/sbin/nologin        
        libstoragemgmt:x:995:992:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin        
        setroubleshoot:x:994:991::/var/lib/setroubleshoot:/sbin/nologin

    -f / PATH/TO/SCRIPT_FILE :  从指定文件中读取编辑脚本
        
        [root@localhost ~]# cat f2
        {lasfhakshfkasdlajsflda;fjlaksdfjlkas}if
        asdfasljfdalsjdfalkjfdlajf
        skdjafksafhakhsfakhfahflahfasfjk
        skdjafksafhakhsfakhfahflahfasfjk
        asdkfalksdfjal;sdjfklasdf
        skdjafksafhakhsfakhfahflahfasfjk
        
        [root@localhost ~]# sed -nf f1 f2
        asdfasljfdalsjdfalkjfdlajf

    -r:  支持使用扩展正则表达式
        
        [root@localhost ~]# echo "/etc/functions" | sed -r 's@/.*/([^/]+/?$)@\1@'
        functions
    -i:  原处编辑
        -i.bak
        在对file操作之前先对file进行备份,备份的文件名是file.bak
    
script:脚本

    地址+命令
    
    地址定界:
        (1)  不给地址:对全文进行处理
        (2)  单地址:        #:  指定的行
        /pattern/ :被此处模式所能够匹配到的每一行
            [root@localhost ~]# cat /etc/fstab | sed -n '/^U/p'
            UUID=f4406f6a-e495-45a0-a85e-3b059c0d3130 /                       xfs     defaults        0 0
            UUID=7c25120e-2371-413d-b584-fdd695b96702 /boot                   xfs     defaults        0 0
            UUID=19470291-724c-4f01-b6e1-7109ad22be1b /usr                    xfs     defaults        0 0
            UUID=c3460309-9e8c-4037-8684-4c6bdcabbacb swap                    swap    defaults        0 0

        (3)  地址范围:        #,#
            [root@localhost ~]# sed -n '9,12p' /etc/fstab 
            UUID=f4406f6a-e495-45a0-a85e-3b059c0d3130 /                       xfs     defaults        0 0
            UUID=7c25120e-2371-413d-b584-fdd695b96702 /boot                   xfs     defaults        0 0
            UUID=19470291-724c-4f01-b6e1-7109ad22be1b /usr                    xfs     defaults        0 0
            UUID=c3460309-9e8c-4037-8684-4c6bdcabbacb swap                    swap    defaults        0 0

        #,+#
            [root@localhost ~]# sed -n '3,+4p' /etc/fstab 
            # /etc/fstab
            # Created by anaconda on Mon Jul 25 12:04:17 2016
            #
            # Accessible filesystems, by reference, are maintained under '/dev/disk'
            # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

        /pat1/,/pat2/
            [root@localhost ~]# sed -n '/^root\b/,/^s/p' /etc/passwd
            root:x:0:0:root:/root:/bin/bash
            bin:x:1:1:bin:/bin:/sbin/nologin
            daemon:x:2:2:daemon:/sbin:/sbin/nologin
            adm:x:3:4:adm:/var/adm:/sbin/nologin
            lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
            sync:x:5:0:sync:/sbin:/bin/sync

        #,/pat1/
            [root@localhost ~]# sed -n '1,/^s/p' /etc/passwd
            root:x:0:0:root:/root:/bin/bash
            bin:x:1:1:bin:/bin:/sbin/nologin
            daemon:x:2:2:daemon:/sbin:/sbin/nologin
            adm:x:3:4:adm:/var/adm:/sbin/nologin
            lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
            sync:x:5:0:sync:/sbin:/bin/sync

        (4) ~ :步进        
            1~2  奇数行        
            2~2  偶数行
编辑命令:    
    d:  删除模式空间匹配的行
        
        [root@localhost ~]# cat f1 
         1	
         2	#
         3	# /etc/fstab
         4	# Created by anaconda on Mon Jul 25 12:04:17 2016
         5	#
         6	# Accessible filesystems, by reference, are maintained under '/dev/disk'
         7	# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
         8	#
         9	UUID=f4406f6a-e495-45a0-a85e-3b059c0d3130 /                       xfs     defaults        0 0
        10	UUID=7c25120e-2371-413d-b584-fdd695b96702 /boot                   xfs     defaults        0 0
        11	UUID=19470291-724c-4f01-b6e1-7109ad22be1b /usr                    xfs     defaults        0 0
        12	UUID=c3460309-9e8c-4037-8684-4c6bdcabbacb swap                    swap    defaults        0 0
    [root@localhost ~]# sed '3d' f1
         1	
         2	#
         4	# Created by anaconda on Mon Jul 25 12:04:17 2016
         5	#
         6	# Accessible filesystems, by reference, are maintained under '/dev/disk'
         7	# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
         8	#
         9	UUID=f4406f6a-e495-45a0-a85e-3b059c0d3130 /                       xfs     defaults        0 0
        10	UUID=7c25120e-2371-413d-b584-fdd695b96702 /boot                   xfs     defaults        0 0
        11	UUID=19470291-724c-4f01-b6e1-7109ad22be1b /usr                    xfs     defaults        0 0
        12	UUID=c3460309-9e8c-4037-8684-4c6bdcabbacb swap                    swap    defaults        0 0

    p:  显示模式空间中的内容
        
        [root@localhost ~]# sed -n '3p' f1
         3	# /etc/fstab

    a \text :在行后面追加文本;支持使用\n 实现多行追加
        
        [root@localhost ~]# sed  '3a\skdfjskdfjksdf' f1
         1	
         2	#
         3	# /etc/fstab
    skdfjskdfjksdf         4	# Created by anaconda on Mon Jul 25 12:04:17 2016
         5	#
         6	# Accessible filesystems, by reference, are maintained under '/dev/disk'
         7	# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
         8	#
         9	UUID=f4406f6a-e495-45a0-a85e-3b059c0d3130 /                       xfs     defaults        0 0
        10	UUID=7c25120e-2371-413d-b584-fdd695b96702 /boot                   xfs     defaults        0 0
        11	UUID=19470291-724c-4f01-b6e1-7109ad22be1b /usr                    xfs     defaults        0 0
        12	UUID=c3460309-9e8c-4037-8684-4c6bdcabbacb swap                    swap    defaults        0 0

    i \text :在行前面插入文本;支持使用\n 实现多行插入
        
        [root@localhost ~]# sed  '3i\123456' f1
         1	
         2	#
    123456
         3	# /etc/fstab
         4	# Created by anaconda on Mon Jul 25 12:04:17 2016
         5	#
         6	# Accessible filesystems, by reference, are maintained under '/dev/disk'
         7	# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
         8	#
         9	UUID=f4406f6a-e495-45a0-a85e-3b059c0d3130 /                       xfs     defaults        0 0
        10	UUID=7c25120e-2371-413d-b584-fdd695b96702 /boot                   xfs     defaults        0 0
        11	UUID=19470291-724c-4f01-b6e1-7109ad22be1b /usr                    xfs     defaults        0 0
        12	UUID=c3460309-9e8c-4037-8684-4c6bdcabbacb swap                    swap    defaults        0 0
    c \text :替换行为单行或多行文本
        
        [root@localhost ~]# sed  '3c\123456abcdefg' f1
         1	
         2	#
    123456abcdefg         
         4	# Created by anaconda on Mon Jul 25 12:04:17 2016
         5	#
         6	# Accessible filesystems, by reference, are maintained under '/dev/disk'
         7	# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
         8	#
         9	UUID=f4406f6a-e495-45a0-a85e-3b059c0d3130 /                       xfs     defaults        0 0
        10	UUID=7c25120e-2371-413d-b584-fdd695b96702 /boot                   xfs     defaults        0 0
        11	UUID=19470291-724c-4f01-b6e1-7109ad22be1b /usr                    xfs     defaults        0 0
        12	UUID=c3460309-9e8c-4037-8684-4c6bdcabbacb swap                    swap    defaults        0 0

    w /path/to/somefile:  保存模式匹配的行至指定文件
    r /path/from/somefile :读取指定文件的文本至模式空
    间中匹配到的行后
    =:  为模式空间中的行打印行号
        [root@localhost ~]# sed = fstab 
        1
        
        2
        #
        3
        # /etc/fstab
        4
        # Created by anaconda on Mon Jul 25 12:04:17 2016
        5
        #
        6
        # Accessible filesystems, by reference, are maintained under '/dev/disk'
        7
        # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
        8
        #
        9
        UUID=f4406f6a-e495-45a0-a85e-3b059c0d3130 /                       xfs     defaults        0 0
        10
        UUID=7c25120e-2371-413d-b584-fdd695b96702 /boot                   xfs     defaults        0 0
        11
        UUID=19470291-724c-4f01-b6e1-7109ad22be1b /usr                    xfs     defaults        0 0
        12
        UUID=c3460309-9e8c-4037-8684-4c6bdcabbacb swap                    swap    defaults        0 0
        [root@localhost ~]# 

    !: 模式空间中匹配行取反处理
  • sed搜索替换    
       s/// :查找替换, 支持使用其它分隔符,s@@@ ,s###
      [root@localhost ~]# sed 's/root/god/' f3
      god
      god
      god root root
    
      替换标记:
      g:  行内全局替换
          [root@localhost ~]# sed 's/root/god/g' f3
          god
          god
          god god god
    
    
          
      p:  显示替换成功的行
      w  /PATH/TO/SOMEFILE :将替换成功的行保存至指定的文件中
  • sed高级编辑命令

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

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