sed

作者: 六月天的安静 | 来源:发表于2017-06-22 22:00 被阅读141次

文本处理sed

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

sed的语法结构:

     sed [OPTION]...{script} [input-file]...[actions]

常用选项:

    -r  :  支持使用扩展正则表达式
    -n  : 不输出模式空间内容到屏幕,即不自动打印(静默模式)
    -e  :  多点编辑(-e script1 -e script2 -e script3 指定多脚本运行)
    -f  : / PATH/SCRIPT_FILE :  从指定文件中读取编辑脚本
    -i  :  直接修改源文件;例如:sed -i '99d' f1 (危险,谨慎操作)
    -i.bak  : 备份;例如:对f1文件删除奇数行之前会自动对f1备份为f1.bak然后再对
                        f1这个源文件进行操作,命令如下:
                           sed -i.bak '1~2d' f1

sed的地址定界:

 (1)  不给地址:对全文进行处理
 
         例如:sed 'p' passwd  : 对passwd文件每行分别在屏幕上打印两次

 (2) 单地址:
 
      #           :#表示数字,指定的行;
                     例如:sed '1p' passwd : 第一行打印两次其它行打印一次
                          sed -n '1p' : 只打印第一行一次
      $           :最后一行;
      /regexp/    :任何能够被regexp所匹配到的行;
                    例如:打印以r开头的行:
                              法1:sed -n '/^r/p' passwd 
                              法2:grep '^r' passwd
    
 (3) 地址范围:  
     
     #,/regexp/       : 从 # 行开始,到第一次被 /regexp/ 所匹配到的行结束,中间的所有行;
                             例如: sed -n '3,/^s/p' passwd
     
     #,#             :从第 # 行到第 # 行;
                           例如: sed -n '3,6p' passwd
                         
     #,+n            :从第 # 行开始,一直到向下的 n 行;
                           例如:sed -n '3,+3p' passwd
                         
    /regexp1/,/regexp2/ : 从第一次被/regexp1/匹配到的行开始,到第一次被/regexp2/匹配到
                          的行结束;
                           例如:匹配以r开头以b开头中间的行:
                                sed -n '/^r/,/^b/p' passwd
 (4) first~step:first:起始行;step:步长
        例如: 
        1、取100个数,起始位置为0,步长为100:seq 1000|sed -n '0~100p'
        2、奇数行: seq 1000|sed -n '1~2p'
        3、偶数行: seq 1000|sed -n '2~2p'                    

sed的编辑命令:

    d : 删除模式空间匹配到的行;
            例如:cat -n  passwd|sed '60d'
            
    p : 打印模式空间中匹配到的内容
    
    a [\]text :在指定行后面追加文本;支持使用\n 实现多行追加
                例如:在f1文件中的第99行的后面追加“new line” :
                     sed '99a\new line ' f1
                例如:在f1文件中的80-99行的后面分别追加“new line” :
                     sed '80,99a\new line ' f1
                例如:在f1文件中的第99行后面添加“new line1,new line2,new line3”
                     sed '99a\new line1\nnew line2\nnew line3' f1
                
    i [\]text :在行前面插入文本
                例如:在f1文件中的第99行的前面追加“new line” :
                     sed '99i\new line ' f1
                例如:在f1文件中的80-99行的前面分别追加“new line” :
                     sed '80,99i\new line ' f1
                例如:在f1文件中的第99行前面添加“new line1,new line2,new line3”
                     sed '99i\new line1\nnew line2\nnew line3' f1
                     
    c [\]text :用text替换匹配到的行;
                例如:用“cxj”替换f1文件第98行的内容:
                        sed '98c\cxj' f1
    
    w /path/somefile:  把指定的内容另存至/path/somefile路径所指定的文件中
                例如:把f1文件中的90-99行另存为f3文件中:
                        sed '90,99w /root/app/f3' f1
    
    r /path/somefile :在文件的指定位置插入另一个文件的所有内容,完成文件合并;
                例如:把/etc/issue中的内容追加到f1文件中90行的后面:
                        sed '90r /etc/issue' f1
    
    s/regexp/replacement/ : 搜索替代替换由regexp所匹配到的内容为replacement;支持
        使用其他分隔符如s@@@,s###;条件是该分隔符在后面的模式中没有出现过),对于替换
        还有两个后选项 g 和 i ,分别表示如下:
                g  : 全局替换
                        例如:sed -n 's/root/RooT/gp' f4 
                i  : 不区分大小写

                例如:将f4文件中的所有root替换为ROOT:
                        sed 's/root/ROOT/' f4
                
    = : 为模式空间中的行打印行号;
            例如:为“ passwd ”这个文件加行号:
                      sed '=' passwd 
                      
    ! : 模式空间中匹配行取反处理;
            例如:处了第10行不打印其它都打印:
                      cat -n passwd | sed -n '10!p'

sed 示例:

    sed ‘2p’ /etc/passwd
    sed –n ‘2p’ /etc/passwd
    sed –n ‘1,4p’ /etc/passwd
    sed –n ‘/root/p’ /etc/passwd
    sed –n ‘2,/root/p’ /etc/passwd  
    sed -n ‘/^$/=’ file  显示空行行号
    sed –n –e ‘/^$/p’ –e ‘/^$/=’ file
    sed ‘/root/a\superman’ /etc/passwd 行后
    sed ‘/root/i\superman’ /etc/passwd  行前
    sed ‘/root/c\superman’ /etc/passwd  代替行

    sed ‘/^$/d’ file
    sed ‘1,10d’ file
    nl /etc/passwd | sed ‘2,5d’
    nl /etc/passwd | sed ‘2a tea’
    sed 's/test/mytest/g' example
    sed –n ‘s/root/&superman/p’ /etc/passwd  单词后
    sed –n ‘s/root/superman&/p’ /etc/passwd  单词前
    sed -e ‘s/dog/cat/’ -e ‘s/hi/lo/’ pets
    sed –i.bak ‘s/dog/cat/g’ pets

高级编辑命令:

sed工作机制是每次读取一行文本至“ 模式空间”中,在模式空间中完成处理,将处理结果
输出至标准输出设备;在模式空间中处理一行内容后会继续处理下一行,那么对于处理
过的行可能还有其它的处理,因此可以先把处理过的行“传送”至保持空间中,然后在后续
的处理过中再次“传送”回模式空间,这就类似加工车间及仓库的概念,好比模式空间是加
工车间,保持空间就是仓库,不过这里的仓库存储的都是些半成品的产品

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

sed 高级编辑命令示例:

1、 sed -n 'n;p' FILE
例子:下面这条命令首先是把1读到模式空间里面然后又因为有了‘ n ’这个命令就会读取1所在这一行的下一行也就是2,然后用2去覆盖模式空间中的1;由于sed自带循环所以会把所有的偶数行全部输出来

1.png

2、sed '1!G;h;$!d' FILE
例子:倒序输出
3.png](https://img.haomeiwen.com/i6144185/34d7503d63142dc8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

3、sed 'N;D‘ FILE
例子:执行过程:首先把f2文件中第一行取出来放到模式空间,因为N所以会去下一行也就是第二行,接着D命令出现就会把模式空间中的首行删掉

4.png

4、sed '$!N;$!D' FILE :只保留最后两行

5、sed '$!d' FILE :取最后一行

6、sed ‘G’ FILE :把原有文件中的每一行之间输入一个空行
7、sed 'g' FILE :把原有的行全部用空行代替

8、sed '/^$/d;G' FILE:把源文件所有的空行删除之后又在此基础上在每行之间加入空行

9、sed 'n;d' FILE
例子:下面这条命令首先把文件f1的第一行取出来放到模式空间,然后又因为有‘ n ’这条命令,所以会读取f1文件里面第一行的下一行,也就是第2行,而读取回来的第2行就会覆盖原来模式空间的内容覆盖掉,这条命令就是把偶数行全部删掉保留奇数行(因为sed自带自动打印所以奇数行得以保留)

2.png

10、sed -n '1!G;h;$p' FILE:倒序输出

相关文章

网友评论

      本文标题:sed

      本文链接:https://www.haomeiwen.com/subject/qhhqcxtx.html