文本处理工具之sed

                          文本处理工具之sed

1、sed是一种行编辑器,对文本逐行处理。处理时,它会将文本行载入"模式空间"(临时缓冲区),接着用sed命令对模式空间的内容进行处理,处理完成后,将模式空间内容输出到显示屏
     与之类似的处理工具还有grep和awk,相比grep,sed不仅对文本有过滤功能,还可以对文本进行其他增删改的操作。而相比awk,sed显得更加简单高效。下面我们就来细说"sed"。
2、用法:sed  [options]   '地址 指令’   file......
    options:一些功能选项
    地址:匹配范围,可以是单行、多行,或者是匹配模式的行,模式支持正则表达式。
    指令:是sed自带的文本处理命令,如打印、删除、更改等。以下做详细解释
options
    -n      不打印模式空间         
    -e      多点编辑,同时处理多条指令   
    -f      读取脚本文件          
    -r      使其支持扩展正则表达式     
    -i      直接修改原文件         
地址
    1       首行                                                      
    n       指定行                                                     
    $       尾行                                                      
    n1,n2       从n1到n2之间所有的行                                                
    n1,+10      从n1开始算起,之后的10行                                          
    /patter/        匹配该模式的行,支持正则                                            
    /pat1/,/pat2/   两个匹配行之间的行,第一次匹配pat1,和第一次匹配part2之间的行。如果只匹配pat1,sed会打印pat1到行尾的所有行 
    n1~n2       ~代表步进,以n1为基准,n2为跳数匹配。如:1~2,就是打印奇数行                          
指令
    p       打印模式空间处理行和过滤行,常与-n一起使用,只打印过滤行
    d       删除过滤行                       
    =       打印行号                        
    q       退出脚本                        
    r       读取文件,通常与aic一起使用             
    w       将匹配内容输出到文件                  
    a\text      在匹配行后追加文本                   
    i\text      在匹配行前面追加文本                  
    c\text      替换匹配行内容                     
    !       通常在 '地址' 后面,表示取反                
    &       引用前面的字符串                    
    s///(g|p|w) 查找替换                        


示例:
                打印匹配行
#sed -n '1p' /etc/passwd            ##打印首行
#sed -n '$p' /etc/passwd            ##打印尾行
#sed -n '1,3p' /etc/passwd          ##打印前三行
#sed -n '1,3!p' /etc/passwd         ##打印除前三行之外的行
#sed -n '/root/,3p' /etc/passwd     ##打印匹配root到第三行之间的行  
#sed -n '/postfix/,$p' /etc/passwd      ##打印匹配行到尾行之间的行
#sed -n -e '1p' -e '$p' /etc/passwd     ##使用-e命令同时处理多条指令
#sed '/root/a\########' /etc/passwd     ##行后追加
#sed '/root/i\########' /etc/passwd     ##行前追加
#sed '/root/c\########' /etc/passwd     ##替换匹配行

                删除匹配行
#sed '1d' /etc/passwd           ##删除首行
#sed '1~2d' /etc/passwd         ##删除奇数行
#sed '10,$d' /etc/passwd        ##删除10行以后的行

                文本替换
#sed -n 's/root/ROOT/p' /etc/passwd     ##将每行首次出现的root替换为ROOT,并打印过滤行
#sed -n 's/root/ROOT/2p' /etc/passwd    ##将文本行中第二次出现的root替换为ROOT,打印该行
#sed -n 's/root/ROOT/gp' /etc/passwd    ##将全文出现的root全部替换成大写,并打印过滤行
#sed -n 's/bin/&2/gp' /etc/passwd       ##全文搜索,将bin替换成bin2,打印这些行

                实用的应用场景
#sed '/^#/d;/^$/d' /etc/fstab               ##去掉/etc/fstab中空行和以#开头的行
#sed -r 's@([^:]+):(.*):([^:]+)@\3:\2:\1@' /etc/passwd  ##将/etc/passwd文件中用户名和默认shell替换位置
--------上述示例,很好的利用了正则的分组匹配
--------([^:]+)表示匹配(非:字符一次以上)
#sed '10,$s/^/#/' /etc/passwd               ##为10行及其之后的行添加#注释符

3、sed高级功能
    sed除了以上基本的文本处理能力外,还具备一些高级用法。
    保持空间:和模式空间一样,也是在sed命令执行的时候,内存给其分配的一块缓冲空间。相比模式空间,保持空间只是一块临时存储空间,其内容不会直接被sed命令处理输出到屏幕
    高级编辑命令
    h       将模式空间内容覆盖至保持空间  
    H       将模式空间内容追加至保持空间  
    g       将保持空间内容覆盖模式空间   
    G       将保持空间内容追加至模式空间  
    x       将保持空间内容和模式空间互换  
    n       读取匹配行的下一行覆盖至模式空间
    N       读取匹配行的下一行追加至模式空间 
文本处理工具之sed 如图:
    h:执行h命令,保持空间内容将变为a。
    H:执行H命令,保持空间内容将变为a\nb\nc\n
    g:执行g命令,模式空间将变为b\nc
    G:执行G命令,模式空间内容变为a\nb\nc
    x:执行x命令,模式空间内容变为b\nc,保持空间内容变为a  二者互换
    n:执行n命令,模式空间内容直接变为d,a直接覆盖,不做任何处理
    N:执行N命令,模式空间内容将变为a\nd
示例  (如上图,txt为a b c d e f  六行内容)
#sed -n 'n;p'  txt      该命令打印txt偶数行 
b
d
f
#sed '1!G;h;$!d'  txt   ##1!G:表示只要不是第一行,都执行G命令。$!d:表示只要不是最后一行,都执行d命令
f
e
d
c
b
a   
#sed '$!N;$!D' txt  ##$!N:表示只要不是最后一行就执行N命令;$!D:表示只要不是最后一行就执行D命令
e
f
#sed -n '1!G;h;$p'  txt ##1!G:表示只要不是第一行就执行G命令,$p:表示最后一行执行p命令
f
e
d
c
b
a

综上:sed命令操作简洁、高效,是linux下必学文本处理工具之一,灵活掌握sed用法,对编写脚本起到很大的帮助

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

(0)
AbigheartAbigheart
上一篇 2017-03-17
下一篇 2017-03-18

相关推荐

  • 第九周

    1、写一个脚本,判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin);分别这两类用户的个数;通过字符串比较来实现;   1 #!/bib/bash   2 #   3 a=0   4 x=0   5 y=…

    Linux干货 2017-05-25
  • 实现真实的机柜模拟图[原创]

    一般能反映机房设备位置、结构我们都喜欢通过网络拓扑图来展现,但个人感觉还不够直观、明了的表现出自己想要的结果(自己太挑剔了,呵呵)。因此写一个生成真实机柜模拟图平台,实现与真实服务器外观、服务状态、空闲位置等信息。在线效果图http://blog.liuts.com/idc/系统截图1、平台显示某一排截图2、平台显示某台服务器详细信息截图3、状态说明2U服务…

    Linux干货 2015-03-27
  • 第三周

    第三周 1.列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 [root@node1 ~]# who -q | sed -n ‘1p’ centos root fedora redhat mint 2.取出最后登录到当前系统的用户的相关信息。 [root@node1 ~]# who -a | tail -1 mint +…

    Linux干货 2017-07-25
  • CentOS启动流程

    CentOS启动大致流程: POST –> BootSequence –> Bootloader –> kernel –> rootfs –> switchroot –> /sbin/init –> (/etc/inittab;/et…

    Linux干货 2017-07-12
  • 第七周

    1、创建一个10G分区,并格式为ext4文件系统; (1) 要求其block大小为2048, 预留空间百分比为2, 卷标为MYDATA, 默认挂载属性包含acl; (2) 挂载至/data/mydata目录,要求挂载时禁止程序自动运行,且不更新文件的访问时间戳; fdisk /dev/sdb欢迎使用 fdisk (util-li…

    Linux干货 2016-09-19
  • 二、(3)Linux的文件与数据之:元数据

    文件的元数据 在Linux的文件系统中,数据可分为两大类:数据和元数据 数据:泛指普通文件中的实际数据 元数据:用来描述一个文件的特征的系统数据 这样抽象的描述并不能很清楚地表示元数据的定义,所以下面将借助stat命令进行举例说明: stat命令 stat – display file or file system status(用于展示文件或文…

    2018-01-11

评论列表(1条)

  • N24_Jerry
    N24_Jerry 2017-04-20 17:07

    通俗易懂,逻辑清晰,循环渐进,实乃经典中的经典!!