文本处理工具之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)
上一篇 2017-03-17 20:11
下一篇 2017-03-18 10:32

相关推荐

  • Linux软件包安装

    Linux系统和Windows系统在软件包安装上区别很大:     软件运行环境:         API: Application Programming Interface    POSIX: P…

    Linux干货 2016-08-21
  • Docker 简介

    Docker在现有云计算虚拟化中是非常火的一个项目,那么他和虚拟化有什么不同呢 从上图来看,好像和我们之前说到的虚拟化并没有什么不同,但这里需要说明的是在各guest主机上,是没有操作系统的,他们共用Host主机上的内核空间,只对用户空间进行了隔离。 因此在这种环境下我们不把他称为虚拟化而称作容器。 此种方式的实现主要基于了linux内核自带的两项技术,分别…

    2017-03-19
  • bash之脚本入门及课后作业

    概述: shell是一个工具程序,在用户登录后后系统启动,它解释并运行由命令或脚本文件输入的命令,从而实现用户与内核之间的交互。bash是Linux操作系统上默认的shell,在交互和编程两方面,bash提供了许多Bourne shell没有的功能,并且还结合了C shell和Kron shell最有用的功能。 bash的语法和结构   …

    Linux干货 2016-08-15
  • python 多版本管理(pyenv)

    01 – Python 简介和安装 01 – Python 简介和安装 1. Python 简介 2. 安装 pyenv 3. pyenv 使用 4. pyenv-virtualenv 5. 安装 IPython 和 Jupyter 01 – Python 简介和安装 1. Python 简介 编程风格 面向过程:以指令为…

    Linux干货 2016-07-10
  • 第三次 练习

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 ~]# who | cut -d "" -f1 |uniq root     pts/0        2016-11-13 12:17 (172.16.220.14) 2、取出最后登录到…

    Linux干货 2016-11-16
  • 第一周作业-02

    Linux的命令格式 命令的语法通用格式:    ~]# COMMAND OPTIONS ARGUMENTS        COMMAND: 发起一命令:请求内核将某个二进制程序运行为一个进程;            程序 –&…

    Linux干货 2016-09-19

评论列表(1条)

  • N24_Jerry
    N24_Jerry 2017-04-20 17:07

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