sed命令解析

处理文件的工具sed


Stream EDitor, 行编辑器
一次只读一行,只处理一行,不对源文件做处理,至输出到屏幕上模式空间

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

用法:
    sed[option]... 'script' inputfile...

常用选项:
    -n: 静默模式,不输出模式空间中的内容;
    -n, --quiet, --silent
          suppress automatic printing of pattern space
    -r: 扩展的正则表达式
    -r, --regexp-extended
          use extended regular expressions in the script.     
    -f /path/to/sed_script_file: 指定sed脚本文件
    -f script-file, --file=script-file
          add the contents of script-file to the commands to be executed
    -e 'script' -e 'script': 指定多个编辑指令
    -e script, --expression=script
          add the script to the commands to be executed
    -i: 直接编辑原文件
          edit files in place

script:
    '地址命令'

编辑命令:
    d: 删除
    p: 打印
    i \text: \n 换行符   行前面插入文本
    a \text: \n 换行符   行下面插入文本
    r /path/to/somefile: 在指定位置把另外一个文件的内容插入进来
    w /path/to/somefile:将符合条件的所有行保存至指定的文件中
    =:显示符合条件的行的行号
    s///: 查找条件可以使用模式,但要替换的内容不行
        ///可以替换为@@@或者###或者$$$
        g:行内全局替换
        p:显示替换成功的行
        w /path/to/somefile:将替换成功的行保存至文件中
    !:模式空间中匹配行取反处理

地址定界
(1) 不给地址:对全文进行处理
(2) 单地址:
    #: 指定的行
    /pattern/:被此处模式所能够匹配到的每一行
(3) 地址范围:
    #,#
    #,+#
    /pat1/,/pat2/
    #,/pat1/
(4) ~:步进
    1~2 奇数行
    2~2 偶数行
    
用法
    #sed [options] 'addr1[,addr2]编辑命令' FILE ...
    #sed [options] “addr1[,addr2]编辑命令” FILE ...

[root@centos7 tmp]# cat f1 /etc/passwd | head -5
     1	root:x:0:0:Sxj,001,002,003:/root:/bin/bash
     2	bin:x:1:1:bin:/bin:/sbin/nologin
     3	daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4	adm:x:3:4:adm:/var/adm:/sbin/nologin
     5	lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@centos7 tmp]# sed '2p' f1 | head -5
###2p  即打印第二行
     1	root:x:0:0:Sxj,001,002,003:/root:/bin/bash
     2	bin:x:1:1:bin:/bin:/sbin/nologin
     2	bin:x:1:1:bin:/bin:/sbin/nologin
     3	daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4	adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@centos7 tmp]# sed -n '2p' f1 
###-n 不输出模式空间中的内容;注意看和上面的区别
     2	bin:x:1:1:bin:/bin:/sbin/nologin
[root@centos7 tmp]# sed -n '1,4p' f1 
     1	root:x:0:0:Sxj,001,002,003:/root:/bin/bash
     2	bin:x:1:1:bin:/bin:/sbin/nologin
     3	daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4	adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@centos7 tmp]# sed -n '/root/p' f1
###包含root字符串的行输出出来
     1	root:x:0:0:Sxj,001,002,003:/root:/bin/bash
    10	operator:x:11:0:operator:/root:/sbin/nologin
    49	rooter:x:0:5009::/home/rooter:/bin/bash
[root@centos7 tmp]# cat -n f2
     1	1
     2	
     3	2
     4	
     5	
     6	3
     7	
  
[root@centos7 tmp]# sed -n '/^$/=' f2
###输出空行的行号 结合上面的cat命令可以看出效果
2
4
5
7
[root@centos7 tmp]# sed -n -e '/^$/p' -e '/^$/=' f2
###-e指定多个编辑命令

2

4

5

7
[root@centos7 tmp]# sed '/^$/d' f2
1
2
3
[root@centos7 tmp]# sed '1,10d' f1 | head -5
    11	games:x:12:100:games:/usr/games:/sbin/nologin
    12	ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    13	nobody:x:99:99:Nobody:/:/sbin/nologin
    14	systemd-bus-proxy:x:999:998:systemd Bus Proxy:/:/sbin/nologin
    15	systemd-network:x:998:997:systemd Network Management:/:/sbin/nologin
[root@centos7 tmp]# sed -n 's/root/&superman/p' /etc/passwd
rootsuperman:x:0:0:Sxj,001,002,003:/root:/bin/bash
operator:x:11:0:operator:/rootsuperman:/sbin/nologin
rootsupermaner:x:0:5009::/home/rooter:/bin/bash
[root@centos7 tmp]# sed -i.bak 's/root/superman/g' f1
###会直接修改文件f1 同时生成备份文件f1.bak  f1.bak为修改前的内容

[root@centos7 tmp]# cat /etc/fstab | sed  -e 's@UUID@ABC@g' -e 's@ABC@DEF@g'
###

DEF=174a1f45-937a-4844-9650-27550836880d /                       ext4    defaults        1 1
DEF=a9778fb4-3adb-471b-96ff-571d2325ee3c /boot                   ext4    defaults        1 2
DEF=fb15ae62-3c30-4cbb-9d4e-a0e3e2531e8c /testdir                ext4    defaults        1 2
DEF=ba38f744-eb07-4306-b0a0-9b58a9ba81f2 swap                    swap    defaults        0 0

[root@centos7 tmp]# cat /etc/fstab | sed  -e 's@UUID@ABC@g' -e 's@UUID@DEF@g'
###和上一个做比较,可以看出第二个-e后的编辑命令是处理第一个-e处理之后的结果

ABC=174a1f45-937a-4844-9650-27550836880d /                       ext4    defaults        1 1
ABC=a9778fb4-3adb-471b-96ff-571d2325ee3c /boot                   ext4    defaults        1 2
ABC=fb15ae62-3c30-4cbb-9d4e-a0e3e2531e8c /testdir                ext4    defaults        1 2
ABC=ba38f744-eb07-4306-b0a0-9b58a9ba81f2 swap                    swap    defaults        0 0

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

sed命令解析

下面用几个实例来说明sed的高级用法:

# sed -n 'n;p' /etc/fstab 显示偶数行
# sed '1!G;h;$!d' FILE 逆序显示文件内容
# sed '$!d' FILE  取出最后一行
# sed '$!N;$!D' FILE  取出文件后两行;
# sed '/^$/d;G' FILE 删除原有的所有空白行,而后为所有非空白行添加一个空白行
# sed 'n;d' FILE 显示奇数行
# sed 'G' FILE 在原有的每行后方添加一个空白行

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

(0)
sixijiesixijie
上一篇 2016-08-11
下一篇 2016-08-11

相关推荐

  • Linux磁盘及文件系统管理

    磁盘(Hard Disk Drive,简称HDD)是一种存储介质,传统的机械硬盘由一个或多个铝制或玻璃制的碟片组成,碟片外覆盖有铁磁性材料。 磁盘的物理结构一般由磁头与碟片、电动机、主控芯片与排线等部件组成;当主电动机带动碟片旋转时,副电动机带动一组(磁头)到相对应的碟片上并确定读取正面还是反面的碟面,磁头悬浮在碟面上画出一个与碟片同心的圆形轨道(磁轨或称柱…

    Linux干货 2015-04-20
  • Ansible (playbook)

    一、YAML 1.1 YAML介绍 YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者。 YAML Ain’t Marku…

    Linux干货 2017-11-01
  • rsync+inotify实现数据同步——单向传输

    实验环境:<从A主机推送数据到B主机[B主机可以有多个]> A主机:10.1.43.102 B主机:10.1.43.103 配置流程: —rsyncserver—- <B主机上配置> 1.vim /etc/rsyncd.conf(用户,目录,模块,虚拟用户及密码文件) vim /etc/rsyncd.…

    Linux干货 2016-10-27
  • Shell脚本编程基础中() (()) [ ] [[ ]] 的使用

    Shell脚本编程基础中() (()) [ ] [[ ]] 的使用 () 生成子进程,括号内的命令将会在子进程中运行,父进程不能够读取在子进程中创建的变量 例: 新建个脚本文件,写入 则执行结果为 $()相当于 ` `  ,返回括号内命令执行结果 (( )) 用作四则运算和逻辑运算,并且支持多个表达式 例: 当 (( )) 加$,则是将获得表达式值,赋值给左…

    2017-11-26
  • Linux的哲学思想

    Linux的哲学思想 linux有个哲学的思想是一切皆文件 其中linux硬件设备也是通过文件来表示的 物理终端 物理终端指的是显示器等硬件终端设备,文件存在于 /dev/console 这个路径下 虚拟终端 虚拟终端指的是在linux命令行连接的终端,文件存在于 /dev/tty# [1,6] 这个路径下 串行终端 指的是使用计算机串行端口连接的终端设备,…

    Linux干货 2018-02-23
  • 磁盘管理与文件系统

      关于磁盘与文件系统大致思路:要想对磁盘进行充分利用,必须要对磁盘进行分区,第二步就是要对分区进行高级格式化,也就是在分区上创建文件系统,在此过程中可以对磁盘的各种属性进行自定义。打个比方来说,创建磁盘分区好比刚买来一个毛坯房,还未装修,还不适宜人居住,那么创建文件系统就好比在光秃秃的毛坯房上进行了装修,这样才更适于人居住使用。 要想搞懂磁盘,首…

    Linux干货 2016-08-30