; 文本处理工具之sed | Linux运维部落

文本处理工具之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       读取匹配行的下一行追加至模式空间 
 如图:
    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,如若转载,请注明出处:/71288

发表评论

电子邮件地址不会被公开。 必填项已用*标注

评论列表(1条)

  • N24_Jerry
    N24_Jerry 2017-04-20 17:07

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

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1660809109@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班

友情链接:万达直属QQ  万达娱乐平台  万达开户  万达娱乐直属  万达招商QQ  万达开户  万达主管QQ  万达娱乐主管  万达登录  万达娱乐主管