sed正则_sed正则表达式 - CSDN
精华内容
参与话题
  • shell编程(四)| sed 正则表达式

    万次阅读 2018-06-21 16:56:25
    sed一,sed概述sed行编辑器stream editor用来操作纯 ASCII 码的文本处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),可以指定仅仅处理哪些行sed处理完成之后把缓冲区的内容送往屏幕,接着...

    sed

    一,sed概述

    sed行编辑器
    stream editor
    用来操作纯 ASCII 码的文本
    处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),可以指定仅仅处理哪些行
    sed处理完成之后把缓冲区的内容送往屏幕,接着处理下一行,这样不断重复, 直到文件末尾
    sed符合条件的处理,不符合条件的不予处理,文件内容并没有 改变,除非用重定向存储输出
    二,调用 sed 命令有两种形式:
    sed [options] 'command' file(s)
    sed [options] -f scriptfile file(s)

    三,多种操作模式

    p 显示   d 删除    a 添加   c 替换   w 写入    i 插入

    1,p 模式操作

    -n 只列出结果sed特殊处理的那一行,不显示原来那一行

    -e 多重编辑

    sed -n '/^#/p' fstab     表示显示以#开头的行

    sed -n '/^#/!p' fstab     表示以#开头的行不显示

    sed -n '/0$/!p' fstab      表示以0结尾的行不显示

    sed -n '/0$/p' fstab       表示显示以0结尾结尾的行


    1. [root@100 mnt]# cat -n fstab   
    2.      1    
    3.      2  #  
    4.      3  # /etc/fstab  
    5.      4  # Created by anaconda on Wed May  7 01:22:57 2014  
    6.      5  #  
    7.      6  UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 /                       xfs     defaults        1 1  
    8.      7  /dev/sda /iscsidisk xfs defaults,_netdev 0 0  
    9. [root@100 mnt]# cat -n fstab | sed -n '2,6p'                       >>>>>>>>显示第2到6行  
    10.      2  #  
    11.      3  # /etc/fstab  
    12.      4  # Created by anaconda on Wed May  7 01:22:57 2014  
    13.      5  #  
    14.      6  UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 /                       xfs     defaults        1 1  
    15. [root@100 mnt]# cat -n fstab | sed -n -e '2p' -e '6p'             >>>>>>>>显示第2和第6行  
    16.      2  #  
    17.      6  UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 /                       xfs     defaults        1 1  
    18. [root@100 mnt]# cat -n fstab | sed -n -e '2p;6p'                  >>>>>>>>显示第2和第6行   这里把上一条合并了  
    19.      2  #  
    20.      6  UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 /                       xfs     defaults        1 1  
    21. [root@100 mnt]# cat -n fstab | sed -n '2p;6p'                     >>>>>>>显示第2和第6行  
    22.      2  #  
    23.      6  UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 /                       xfs     defaults        1 1  

    sed -n -e '2!p'  fstab    表示第二行不显示

    sed -n -e '2,5!p'  fstab  表示第2到5行不现实

    1. [root@100 mnt]# cat -n fstab | sed -n -e '2!p'  
    2.      1    
    3.      3  # /etc/fstab  
    4.      4  # Created by anaconda on Wed May  7 01:22:57 2014  
    5.      5  #  
    6.      6  UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 /                       xfs     defaults        1 1  
    7.      7  /dev/sda /iscsidisk xfs defaults,_netdev 0 0  
    8. [root@100 mnt]# cat -n fstab | sed -n -e '2,5!p'  
    9.      1    
    10.      6  UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 /                       xfs     defaults        1 1  
    11.      7  /dev/sda /iscsidisk xfs defaults,_netdev 0 0  

    sed -n -e '2!p;6!p' | uniq -d  fstab   表示第2,6行不显示

    sed -n -e  '2!p;6!p' uniq -u  fstab     表示只显示第2,6行

    1. [root@100 mnt]# cat -n fstab | sed -n -e '2!p;6!p'                  >>>>>会有重复的,但是第2行和第6行没有重复  
    2.      1    
    3.      1    
    4.      2  #  
    5.      3  # /etc/fstab  
    6.      3  # /etc/fstab  
    7.      4  # Created by anaconda on Wed May  7 01:22:57 2014  
    8.      4  # Created by anaconda on Wed May  7 01:22:57 2014  
    9.      5  #  
    10.      5  #  
    11.      6  UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 /                       xfs     defaults        1 1  
    12.      7  /dev/sda /iscsidisk xfs defaults,_netdev 0 0  
    13.      7  /dev/sda /iscsidisk xfs defaults,_netdev 0 0  
    14. [root@100 mnt]# cat -n fstab | sed -n -e '2!p;6!p' | uniq -d        >>>>>>uniq -d表示显示重复的行 -d=--repeated  
    15.      1    
    16.      3  # /etc/fstab  
    17.      4  # Created by anaconda on Wed May  7 01:22:57 2014  
    18.      5  #  
    19.      7  /dev/sda /iscsidisk xfs defaults,_netdev 0 0  
    20. [root@100 mnt]# cat -n fstab | sed -n -e '2!p;6!p' | uniq -u        >>>>>>uniq -u表示显示不重复的行 -u=--unique  
    21.      2  #  
    22.      6  UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 /                       xfs     defaults        1 1  

    练习

    给定userfile和passfile,批量创建用户

    1. [root@100 mnt]# cat userfile   
    2. user1  
    3. user2  
    4. user3  
    5. [root@100 mnt]# cat passwdfile   
    6. user1123  
    7. user2123  
    8. user3123  
    9. [root@100 mnt]# cat user.sh   
    10. #################################  
    11. # Author:           Minz        #  
    12. # Version:                      #  
    13. # Mail:           zmxxx@163.com #  
    14. # Date:        2018-06-19       #  
    15. # Description                   #  
    16. #                               #  
    17. #################################  
    18.   
    19. #!/bin/bas  
    20. NUM=$( echo `wc -l userfile` | cut -d " " -f 1 )  >>>>确定用户数  
    21. for i in `seq 1 $NUM `                            >>>>seq 从1开始递增  
    22. do  
    23.     USERNAME=`sed -n "${i}p" userfile`  
    24.     PASSWORD=`sed -n "${i}p" passwdfile`  
    25.     useradd $USERNAME  
    26.     echo $PASSWORD | passwd --stdin  $USERNAME  
    27. done  
    28.   
    29. 测试  
    30. [root@100 mnt]# sh user.sh   
    31. Changing password for user user1.  
    32. passwd: all authentication tokens updated successfully.  
    33. Changing password for user user2.  
    34. passwd: all authentication tokens updated successfully.  
    35. Changing password for user user3.  
    36. passwd: all authentication tokens updated successfully.  

    2,d模式

    sed -e '2d;6d' fstab   表示第2行,第6行删除

    sed -e '2,6d' fstab     表示第2到6行删除

    sed -e '/^#/d' fstab   表示删除以#开头的行

    sed -e '/^$/d;/^#/d' fstab   表示删除空行并且以#开头的行     ^$表示首尾相连,也就是空行

    sed -e '/UUID/d' fstab   表示删除含有UUID的行

    sed -e '/UUID/!d' fstab  表示不删除含有UUID的行,也就是只显示含有UUID的行

    4,a模式

    sed '/hello/aword' westos 表示把word加在含有hello后一行  默认是在后面一行追加

    sed 's/hello/hello world/g' westos  表示把含有hello的行替换为hello world  ,这里g是全文替换,注意前面有s

    sed '/hello/aworld westos' westos  表示在含有hello后面一行追加world westos,其中world westos在一行

    sed '/hello/aworld\nwestos' westos  表示在含有hello 后面一行追加 world westos,但是有\n表示换行


    5,i模式

    sed '/hello/iworld\nwestos' westos  表示在含有hello行的前面插入world westos,\n表示换行

    6,c模式

    sed '/hello/chello world' westos     表示把含有hello的行替换为hello

    sed '/hello/cwestos\nworld' westos   表示把含有hello的行替换为westos world,\n表示换行


    7,w模式

    前面的模式默认是不会改变文件的内容的

    sed -n '/bash$/p' passwd > file     重定向写入文件

    sed -n '/bash$/wfile' passwd         在w模式下,可以直接写入文件,这是追加的过程,不会覆盖原文

    四,sed其他常用命令

    sed命令
    a\\ 在当前行下面插入文本。
    i\\ 在当前行上面插入文本。
    c\\ 把选定的行改为新的文本。
    d 删除,删除选择的行。
    D 删除模板块的第一行。
    s 替换指定字符
    h 拷贝模板块的内容到内存中的缓冲区。
    H 追加模板块的内容到内存中的缓冲区。
    g 获得内存缓冲区的内容,并替代当前模板块中的文本。
    G 获得内存缓冲区的内容,并追加到当前模板块文本的后面。
    l 列表不能打印字符的清单。
    n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
    N 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
    p 打印模板块的行。
    P(大写) 打印模板块的第一行。
    q 退出Sed。
    b lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
    r file 从file中读行。
    t label if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
    T label 错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
    w file 写并追加模板块到file末尾。
    W file 写并追加模板块的第一行到file末尾。
    ! 表示后面的命令对所有没有被选定的行发生作用。
    = 打印当前行号码。
    # 把注释扩展到下一个换行符以前。

    sed替换标记
    g 表示行内全面替换。
    p 表示打印行。
    w 表示把行写入一个文件。
    x 表示互换模板块中的文本和缓冲区中的文本。
    y 表示把一个字符翻译为另外的字符(但是不用于正则表达式)
    \\1 子串匹配标记
    & 已匹配字符串标记

    sed元字符集
    ^ 匹配行开始,如:/^sed/匹配所有以sed开头的行。
    $ 匹配行结束,如:/sed$/匹配所有以sed结尾的行。
    . 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。
    * 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
    [] 匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed。
    [^] 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
    \\(..\\) 匹配子串,保存匹配的字符,如s/\\(love\\)able/\\1rs,loveable被替换成lovers。
    & 保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。
    \\< 匹配单词的开始,如:/\\\\> 匹配单词的结束,如/love\\>/匹配包含以love结尾的单词的行。
    x\\{m\\} 重复字符x,m次,如:/0\\{5\\}/匹配包含5个0的行。
    x\\{m,\\} 重复字符x,至少m次,如:/0\\{5,\\}/匹配至少有5个0的行。
    x\\{m,n\\} 重复字符x,至少m次,不多于n次,如:/0\\{5,10\\}/匹配5~10个0的行。


    [root@100 mnt]# cat westos 
    hello
    [root@100 mnt]# sed '/hello/=' westos     显示包含hello的行并且输出行号
    1
    hello
    [root@100 mnt]# sed -n '/hello/=' westos  只显示包含hello的行号
    [root@100 mnt]# cat westos 
    hello
    [root@100 mnt]# sed '/hello/=' -i westos  -i表示插入文本,插入位置在包行hello的行的上面一行
    [root@100 mnt]# cat westos 
    1
    hello
    
    [root@100 mnt]# cat westos 
    hello
    [root@100 mnt]# sed '/hello/=' westos 
    1
    hello
    [root@100 mnt]# echo `sed '/hello/=' westos`  echo 把原来两行的变成了一行的内容
    1 hello
    
    [root@100 mnt]# cat westos 
    hello
    world
    [root@100 mnt]# sed '=' westos  打印每一行的行号,并且显示在该行的上面
    1
    hello
    2
    world
    [root@100 mnt]# echo `sed '=' westos` 多行变一行
    1 hello 2 world
    
    [root@100 mnt]# cat westos 
    ##############################################
    [root@100 mnt]# sed '2r westos' fstab   表示把westos中的内容写在fstab的第2行之后
    
    #
    ##############################################
    # /etc/fstab
    # Created by anaconda on Wed May  7 01:22:57 2014
    #
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
    # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    #
    UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 /                       xfs     defaults        1 1
    [root@100 mnt]# sed '$r westos' fstab     表示把westos中的内容写在fstab的尾行之后
    
    #
    # /etc/fstab
    # Created by anaconda on Wed May  7 01:22:57 2014
    #
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
    # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    #
    UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 /                       xfs     defaults        1 1
    ##############################################
    
    [root@100 mnt]# sed -n '/^UUID/=' fstab     不显示原来内容,把以UUID开头的行号显示出来
    9
    [root@100 mnt]# sed  '/^UUID/=' fstab        显示原来内容,把以UUID开头的行号显示出来,默认行号在搜索内容的上一行显示
    
    #
    # /etc/fstab
    # Created by anaconda on Wed May  7 01:22:57 2014
    #
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
    # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    #
    9
    UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 /                       xfs     defaults        1 1
    
    [root@100 mnt]# sed -n -e '/^UUID/p' fstab 
    UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 /                       xfs     defaults        1 1
    [root@100 mnt]# sed -n -e '/^UUID/p' -n -e '/^UUID/=' fstab   既显示搜索行,也显示行号 -e 表示扩展
    UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 /                       xfs     defaults        1 1
    9
    [root@100 mnt]# sed -n -e '/^UUID/p;/^UUID/=' fstab       可以合并
    UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 /                       xfs     defaults        1 1
    9
    
    [root@100 mnt]# sed '=' fstab 在所有行的前面一行添加行号
    1
    
    2
    #
    3
    # /etc/fstab
    4
    # Created by anaconda on Wed May  7 01:22:57 2014
    5
    #
    6
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
    7
    # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    8
    #
    9
    UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 /                       xfs     defaults        1 1
    10
    /dev/sda /iscsidisk xfs defaults,_netdev 0 0
    [root@100 mnt]# sed '=' fstab | sed 'N;s/\n//g'  给每一行行首添加行号 s表示替换
    1
    2#
    3# /etc/fstab
    4# Created by anaconda on Wed May  7 01:22:57 2014
    5#
    6# Accessible filesystems, by reference, are maintained under '/dev/disk'
    7# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    8#
    9UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 /                       xfs     defaults        1 1
    10/dev/sda /iscsidisk xfs defaults,_netdev 0 0
    
    [root@100 mnt]# sed '=' fstab | sed 'N;s/\n/ /g' 给每一行行首添加行号和空格
    1 
    2 #
    3 # /etc/fstab
    4 # Created by anaconda on Wed May  7 01:22:57 2014
    5 #
    6 # Accessible filesystems, by reference, are maintained under '/dev/disk'
    7 # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    8 #
    9 UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 /                       xfs     defaults        1 1
    10 /dev/sda /iscsidisk xfs defaults,_netdev 0 0
    
    [root@100 mnt]# cat fstab 
    # Created by anaconda on Wed May  7 01:22:57 2014
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
    UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 /                       xfs     defaults        1 1
    /dev/sda /iscsidisk xfs defaults,_netdev 0 0
    [root@100 mnt]# sed 'G' fstab   每一行后面添加空行
    # Created by anaconda on Wed May  7 01:22:57 2014
    
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
    
    UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 /                       xfs     defaults        1 1
    
    /dev/sda /iscsidisk xfs defaults,_netdev 0 0
    
    [root@100 mnt]# sed '$!G' fstab     除了最后一行外,每一行后面添加空行
    # Created by anaconda on Wed May  7 01:22:57 2014
    
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
    
    UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 /                       xfs     defaults        1 1
    
    /dev/sda /iscsidisk xfs defaults,_netdev 0 0
    
    [root@100 mnt]# cat fstab 
    # Created by anaconda on Wed May  7 01:22:57 2014
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
    UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 /                       xfs     defaults        1 1
    /dev/sda /iscsidisk xfs defaults,_netdev 0 0
    [root@100 mnt]# sed -n '2p' fstab    打印第2行的内容
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
    [root@100 mnt]# sed -n '$p' fstab    打印最后一行的内容
    /dev/sda /iscsidisk xfs defaults,_netdev 0 0


    全文替换命令

    注意:sed的c模式也可以进行替换,c模式的替换是对关键字的整行进行替换,但是s参数是只对关键字进行替换

    [root@147 mnt]# cat passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    gnome-initial-setup:x:993:991::/run/gnome-initial-setup/:/sbin/nologin
    tcpdump:x:72:72::/:/sbin/nologin
    p:x:1001:1001::/home/p:/bin/bash
    user1:x:1002:1002::/home/user1:/bin/bash
    user2:x:1003:1003::/home/user2:/bin/bash
    user3:x:1004:1004::/home/user3:/bin/bash
    
    [root@147 mnt]# sed 's/nologin/westos/g' passwd                     >>>>>s表示替换,g表示全文的  把nologin全文替换为westos
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/westos
    daemon:x:2:2:daemon:/sbin:/sbin/westos
    adm:x:3:4:adm:/var/adm:/sbin/westos
    lp:x:4:7:lp:/var/spool/lpd:/sbin/westos
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/westos
    operator:x:11:0:operator:/root:/sbin/westos
    games:x:12:100:games:/usr/games:/sbin/westos
    ftp:x:14:50:FTP User:/var/ftp:/sbin/westos
    nobody:x:99:99:Nobody:/:/sbin/westos
    gnome-initial-setup:x:993:991::/run/gnome-initial-setup/:/sbin/westos
    tcpdump:x:72:72::/:/sbin/westos
    p:x:1001:1001::/home/p:/bin/bash
    user1:x:1002:1002::/home/user1:/bin/bash
    user2:x:1003:1003::/home/user2:/bin/bash
    user3:x:1004:1004::/home/user3:/bin/bash
    [root@147 mnt]# sed '3,5s/nologin/westos/g' passwd                 >>>>>>全文替换替换3到5行的nologin为westos
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/westos
    adm:x:3:4:adm:/var/adm:/sbin/westos
    lp:x:4:7:lp:/var/spool/lpd:/sbin/westos
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    gnome-initial-setup:x:993:991::/run/gnome-initial-setup/:/sbin/nologin
    tcpdump:x:72:72::/:/sbin/nologin
    p:x:1001:1001::/home/p:/bin/bash
    user1:x:1002:1002::/home/user1:/bin/bash
    user2:x:1003:1003::/home/user2:/bin/bash
    user3:x:1004:1004::/home/user3:/bin/bash
    
    [root@147 mnt]# sed -e '/adm/,/sync/s/nologin/westos/g' passwd              >>>>>从包含adm到包行sync的行里面,全文替换nologin为westos
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/westos
    lp:x:4:7:lp:/var/spool/lpd:/sbin/westos
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    gnome-initial-setup:x:993:991::/run/gnome-initial-setup/:/sbin/nologin
    tcpdump:x:72:72::/:/sbin/nologin
    p:x:1001:1001::/home/p:/bin/bash
    user1:x:1002:1002::/home/user1:/bin/bash
    user2:x:1003:1003::/home/user2:/bin/bash
    user3:x:1004:1004::/home/user3:/bin/bash
    [root@147 mnt]# sed -e '/adm/,/sync/s/nologin/westos/g;s/sbin/lee/g' passwd  >>>>从包含adm到包行sync的行里面,全文替换nologin为westos,全文替换sbin为lee   ;表示衔接多个操作
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/lee/nologin
    daemon:x:2:2:daemon:/lee:/lee/nologin
    adm:x:3:4:adm:/var/adm:/lee/westos
    lp:x:4:7:lp:/var/spool/lpd:/lee/westos
    sync:x:5:0:sync:/lee:/bin/sync
    shutdown:x:6:0:shutdown:/lee:/lee/shutdown
    halt:x:7:0:halt:/lee:/lee/halt
    mail:x:8:12:mail:/var/spool/mail:/lee/nologin
    operator:x:11:0:operator:/root:/lee/nologin
    games:x:12:100:games:/usr/games:/lee/nologin
    ftp:x:14:50:FTP User:/var/ftp:/lee/nologin
    nobody:x:99:99:Nobody:/:/lee/nologin
    gnome-initial-setup:x:993:991::/run/gnome-initial-setup/:/lee/nologin
    tcpdump:x:72:72::/:/lee/nologin
    p:x:1001:1001::/home/p:/bin/bash
    user1:x:1002:1002::/home/user1:/bin/bash
    user2:x:1003:1003::/home/user2:/bin/bash
    user3:x:1004:1004::/home/user3:/bin/bash
    [root@147 mnt]# vim file
    [root@147 mnt]# cat file                     >>>>>把命令写在文件里面
    s/sbin/westos/g
    s/nologin/linux/g
    [root@147 mnt]# sed -f file passwd            >>>>>-f后面指定命令文件
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/westos/linux
    daemon:x:2:2:daemon:/westos:/westos/linux
    adm:x:3:4:adm:/var/adm:/westos/linux
    lp:x:4:7:lp:/var/spool/lpd:/westos/linux
    sync:x:5:0:sync:/westos:/bin/sync
    shutdown:x:6:0:shutdown:/westos:/westos/shutdown
    halt:x:7:0:halt:/westos:/westos/halt
    mail:x:8:12:mail:/var/spool/mail:/westos/linux
    operator:x:11:0:operator:/root:/westos/linux
    games:x:12:100:games:/usr/games:/westos/linux
    ftp:x:14:50:FTP User:/var/ftp:/westos/linux
    nobody:x:99:99:Nobody:/:/westos/linux
    gnome-initial-setup:x:993:991::/run/gnome-initial-setup/:/westos/linux
    tcpdump:x:72:72::/:/westos/linux
    p:x:1001:1001::/home/p:/bin/bash
    user1:x:1002:1002::/home/user1:/bin/bash
    user2:x:1003:1003::/home/user2:/bin/bash
    user3:x:1004:1004::/home/user3:/bin/bash
    [root@147 mnt]# cat passwd                      >>>>>注意sed的操作是不会改变源文件的内容的
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    gnome-initial-setup:x:993:991::/run/gnome-initial-setup/:/sbin/nologin
    tcpdump:x:72:72::/:/sbin/nologin
    p:x:1001:1001::/home/p:/bin/bash
    user1:x:1002:1002::/home/user1:/bin/bash
    user2:x:1003:1003::/home/user2:/bin/bash
    user3:x:1004:1004::/home/user3:/bin/bash
    [root@147 mnt]# sed -f file -i passwd                   >>>>>-i输入到passwd文件,保存起来
    [root@147 mnt]# cat passwd                              >>>>>此时查看源文件也被修改了
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/westos/linux
    daemon:x:2:2:daemon:/westos:/westos/linux
    adm:x:3:4:adm:/var/adm:/westos/linux
    lp:x:4:7:lp:/var/spool/lpd:/westos/linux
    sync:x:5:0:sync:/westos:/bin/sync
    shutdown:x:6:0:shutdown:/westos:/westos/shutdown
    halt:x:7:0:halt:/westos:/westos/halt
    mail:x:8:12:mail:/var/spool/mail:/westos/linux
    operator:x:11:0:operator:/root:/westos/linux
    games:x:12:100:games:/usr/games:/westos/linux
    ftp:x:14:50:FTP User:/var/ftp:/westos/linux
    nobody:x:99:99:Nobody:/:/westos/linux
    gnome-initial-setup:x:993:991::/run/gnome-initial-setup/:/westos/linux
    tcpdump:x:72:72::/:/westos/linux
    p:x:1001:1001::/home/p:/bin/bash
    user1:x:1002:1002::/home/user1:/bin/bash
    user2:x:1003:1003::/home/user2:/bin/bash
    user3:x:1004:1004::/home/user3:/bin/bash

    五,shell脚本练习

    编写脚本,安装httpd服务,修改httpd服务的端口

    测试





    展开全文
  • Sed 命令详解 & 正则表达式

    千次阅读 2018-03-16 08:23:42
    1.简介sed是非交互式的编辑器。它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。具体过程如下:首先sed把当前...
    1.简介
    sed是非交互式的编辑器。它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。
    sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。具体过程如下:首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间),然后处理临时缓冲区中的行,完成后把该行发送到屏幕上。sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示。处理完输入文件的最后一行后,sed便结束运行。sed把每一行都存在临时缓冲区中,对这个副本进行编辑,所以不会修改原文件。
     
    2.定址
    定址用于决定对哪些行进行编辑。地址的形式可以是数字、正则表达式、或二者的结合。如果没有指定地址,sed将处理输入文件的所有行。
     
    地址是一个数字,则表示行号;是“$"符号,则表示最后一行。例如: 

    sed -'3p' datafile
    只打印第三行

      只显示指定行范围的文件内容,例如:

    # 只查看文件的第100行到第200行
    sed -n '100,200p' mysql_slow_query.log

     地址是逗号分隔的,那么需要处理的地址是这两行之间的范围(包括这两行在内)。范围可以用数字、正则表达式、或二者的组合表示。例如:

    sed '2,5d' datafile
    #删除第二到第五行
    sed '/My/,/You/d' datafile
    #删除包含"My"行到包含"You"行之间的行
    sed '/My/,10d' datafile
    #删除包含"My"行到第十行的内容

     3.命令与选项

    sed命令告诉sed如何处理由地址指定的各输入行,如果没有指定地址则处理所有的输入行。

     3.1 sed命令

     命令 功能
     a\

     在当前行后添加一行或多行。多行时除最后一行外,每行末尾需用“\”续行

     c\ 用此符号后的新文本替换当前行中的文本。多行时除最后一行外,每行末尾需用"\"续行
     i\ 在当前行之前插入文本。多行时除最后一行外,每行末尾需用"\"续行
     d 删除行
     h 把模式空间里的内容复制到暂存缓冲区
     H 把模式空间里的内容追加到暂存缓冲区
     g 把暂存缓冲区里的内容复制到模式空间,覆盖原有的内容
     G 把暂存缓冲区的内容追加到模式空间里,追加在原有内容的后面
     l 列出非打印字符
     p 打印行
     n 读入下一输入行,并从下一条命令而不是第一条命令开始对其的处理
     q 结束或退出sed
     r 从文件中读取输入行
     ! 对所选行以外的所有行应用命令
     s 用一个字符串替换另一个
     g 在行内进行全局替换
      
     w 将所选的行写入文件
     x 交换暂存缓冲区与模式空间的内容
     y 将字符替换为另一字符(不能对正则表达式使用y命令)

     3.2 sed选项

     选项 功能
     -e 进行多项编辑,即对输入行应用多条sed命令时使用
     -n 取消默认的输出
     -f 指定sed脚本的文件名
     
     4.退出状态
    sed不向grep一样,不管是否找到指定的模式,它的退出状态都是0。只有当命令存在语法错误时,sed的退出状态才不是0。
    5.正则表达式元字符
     与grep一样,sed也支持特殊元字符,来进行模式查找、替换。不同的是,sed使用的正则表达式是括在斜杠线"/"之间的模式。
    如果要把正则表达式分隔符"/"改为另一个字符,比如o,只要在这个字符前加一个反斜线,在字符后跟上正则表达式,再跟上这个字符即可。例如:sed -n '\o^Myop' datafile
     
     元字符 功能 示例
     ^ 行首定位符 /^my/  匹配所有以my开头的行
     $ 行尾定位符 /my$/  匹配所有以my结尾的行
     . 匹配除换行符以外的单个字符 /m..y/  匹配包含字母m,后跟两个任意字符,再跟字母y的行
     * 匹配零个或多个前导字符 /my*/  匹配包含字母m,后跟零个或多个y字母的行
     [] 匹配指定字符组内的任一字符 /[Mm]y/  匹配包含My或my的行
     [^] 匹配不在指定字符组内的任一字符 /[^Mm]y/  匹配包含y,但y之前的那个字符不是M或m的行
      保存已匹配的字符 1,20s/self/\1r/  标记元字符之间的模式,并将其保存为标签1,之后可以使用\1来引用它。最多可以定义9个标签,从左边开始编号,最左边的是第一个。此例中,对第1到第20行进行处理,you被保存为标签1,如果发现youself,则替换为your。
     & 保存查找串以便在替换串中引用 s/my/**&**/  符号&代表查找串。my将被替换为**my**
     \< 词首定位符 /\<my/  匹配包含以my开头的单词的行
     \> 词尾定位符 /my\>/  匹配包含以my结尾的单词的行
     x\{m\} 连续m个x /9\{5\}/ 匹配包含连续5个9的行
     x\{m,\} 至少m个x /9\{5,\}/  匹配包含至少连续5个9的行
     x\{m,n\} 至少m个,但不超过n个x /9\{5,7\}/  匹配包含连续5到7个9的行
     
    6.范例
     
    6.1 p命令
    命令p用于显示模式空间的内容。默认情况下,sed把输入行打印在屏幕上,选项-n用于取消默认的打印操作。当选项-n和命令p同时出现时,sed可打印选定的内容。
     

    sed '/my/p' datafile
    #默认情况下,sed把所有输入行都打印在标准输出上。如果某行匹配模式my,p命令将把该行另外打印一遍。


    sed -'/my/p' datafile
    #选项-n取消sed默认的打印,p命令把匹配模式my的行打印一遍。

     6.2 d命令

    命令d用于删除输入行。sed先将输入行从文件复制到模式空间里,然后对该行执行sed命令,最后将模式空间里的内容显示在屏幕上。如果发出的是命令d,当前模式空间里的输入行会被删除,不被显示。

    sed '$d' datafile
    #删除最后一行,其余的都被显示

    sed '/my/d' datafile
    #删除包含my的行,其余的都被显示

     6.3 s命令

    sed 's/^My/You/g' datafile
    #命令末端的g表示在行内进行全局替换,也就是说如果某行出现多个My,所有的My都被替换为You。

    sed -'1,20s/My$/You/gp' datafile
    #取消默认输出,处理1到20行里匹配以My结尾的行,把行内所有的My替换为You,并打印到屏幕上。

      

    sed 's#My#Your#g' datafile
    #紧跟在s命令后的字符就是查找串和替换串之间的分隔符。分隔符默认为正斜杠,但可以改变。无论什么字符(换行符、反斜线除外),只要紧跟s命令,就成了新的串分隔符。

     

    6.4 e选项

    -e是编辑命令,用于sed执行多个编辑任务的情况下。在下一行开始编辑前,所有的编辑动作将应用到模式缓冲区中的行上。

    sed -'1,10d' -'s/My/Your/g' datafile

    #选项-e用于进行多重编辑。第一重编辑删除第1-3行。第二重编辑将出现的所有My替换为Your。因为是逐行进行这两项编辑(即这两个命令都在模式空间的当前行上执行),所以编辑命令的顺序会影响结果。

     6.5 r命令

    r命令是读命令。sed使用该命令将一个文本文件中的内容加到当前文件的特定位置上。

    sed '/My/r introduce.txt' datafile
    #如果在文件datafile的某一行匹配到模式My,就在该行后读入文件introduce.txt的内容。如果出现My的行不止一行,则在出现My的各行后都读入introduce.txt文件的内容。

     
    6.6 w命令

    sed -'/hrwang/w me.txt' datafile

     6.7 a\ 命令

    a\ 命令是追加命令,追加将添加新文本到文件中当前行(即读入模式缓冲区中的行)的后面。所追加的文本行位于sed命令的下方另起一行。如果要追加的内容超过一行,则每一行都必须以反斜线结束,最后一行除外。最后一行将以引号和文件名结束。

    sed '/^hrwang/a\
    >hrwang and mjfan are husband\
    >and wife'
     datafile
    #如果在datafile文件中发现匹配以hrwang开头的行,则在该行下面追加hrwang and mjfan are husband and wife

     6.8 i\ 命令

    i\ 命令是在当前行的前面插入新的文本。

     6.9 c\ 命令

    sed使用该命令将已有文本修改成新的文本。

     6.10 n命令

    sed使用该命令获取输入文件的下一行,并将其读入到模式缓冲区中,任何sed命令都将应用到匹配行紧接着的下一行上。

    sed '/hrwang/{n;s/My/Your/;}' datafile

    注:如果需要使用多条命令,或者需要在某个地址范围内嵌套地址,就必须用花括号将命令括起来,每行只写一条命令,或这用分号分割同一行中的多条命令。
     6.11 y命令
    该命令与UNIX/Linux中的tr命令类似,字符按照一对一的方式从左到右进行转换。例如,y/abc/ABC/将把所有小写的a转换成A,小写的b转换成B,小写的c转换成C。
     

    sed '1,20y/hrwang12/HRWANG^$/' datafile
    #将1到20行内,所有的小写hrwang转换成大写,将1转换成^,将2转换成$
    #正则表达式元字符对y命令不起作用。与s命令的分隔符一样,斜线可以被替换成其它的字符。

     6.12 q命令

    q命令将导致sed程序退出,不再进行其它的处理。

    sed '/hrwang/{s/hrwang/HRWANG/;q;}' datafile

     6.13 h命令和g命令

    #cat datafile

    My name is hrwang.

    Your name is mjfan.

    hrwang is mjfan's husband.

    mjfan is hrwang's wife.

      

    sed -'/hrwang/h' -'$G' datafile

    sed -e '/hrwang/H' -e '$G' datafile

    #通过上面两条命令,你会发现h会把原来暂存缓冲区的内容清除,只保存最近一次执行h时保存进去的模式空间的内容。而H命令则把每次匹配hrwnag的行都追加保存在暂存缓冲区。

    sed -e '/hrwang/H' -e '$g' datafile

    sed -e '/hrwang/H' -e '$G' datafile

    #通过上面两条命令,你会发现g把暂存缓冲区中的内容替换掉了模式空间中当前行的内容,此处即替换了最后一行。而G命令则把暂存缓冲区的内容追加到了模式空间的当前行后。此处即追加到了末尾。

     7. sed脚本

    sed脚本就是写在文件中的一列sed命令。脚本中,要求命令的末尾不能有任何多余的空格或文本。如果在一行中有多个命令,要用分号分隔。执行脚本时,sed先将输入文件中第一行复制到模式缓冲区,然后对其执行脚本中所有的命令。每一行处理完毕后,sed再复制文件中下一行到模式缓冲区,对其执行脚本中所有命令。使用sed脚本时,不再用引号来确保sed命令不被shell解释。例如sed脚本script:

    #handle datafile
    3i\
    ~~~~~~~~~~~~~~~~~~~~~
    3,$s/\(hrwang\) is
     \(mjfan\)/\2 is \1/
    $a\
    We will love eachother forever!!
     

     

     #sed -f script datafile
    My name is hrwang
    Your name is mjfan
    ~~~~~~~~~~~~~~~~~~~~~
    mjfan is hrwang's husband.          
    mjfan is hrwang'
    s wife.

    We will love eachother forever!!



    Linux正则表达式技术指南

    发表于2009-12-31 11:13次阅读| 来源 TechTarget中国1 条评论| 作者
    摘要:作为一个Linux管理员,您需要对文本文件进行处理。您可以使用不同的工具如grep、awk以及sed去查找包含特定文本串的文件。这里,我将介绍一种使用正则表达式,以灵活的方式,去搜索文件中的文本的方法。
            作为一个Linux管理员,您需要对文本文件进行处理。您可以使用不同的工具如grep、awk以及sed去查找包含特定文本串的文件。这里,我将介绍一种使用正则表达式,以灵活的方式,去搜索文件中的文本的方法。

      让我们考虑一个正则表达式发挥作用的例子。比如,当你尝试使用命令grep –r host /时,其返回的结果会很庞大。因为每一个包含host这个文本串的字(像ghostscript这样的字)都会匹配。采用正则表达式,你可以更好地定制你要查找什么。例如,你可以使用正则表达式'^host',告诉grep仅仅查找以host开始的行。

      正则表达式并不是在所有命令中都可用,您使用的命令必须已经事先编好程序,以便能够使用正则表达式。这些命令中最普遍使用的命令是grep、tr以及vi。其它的工具,像sed和awk,也可以使用正则表达式。

      使用正则表达式的一个例子为:

      grep 'lin.x' *

      正则表达式'lin.x'中的点有特殊的含义。它会匹配处于该位置的任意字符。为了防止解释性的问题,我建议您总是将正则表达式置于单引号间,这样就可以防止shell对正则表达式进行解释。

      使用正则表达式

      您可以使用正则表达式做很多事情。在以下的列表中,您可以找到一些最普通、最常用的正则表达式的例子。

        * ^:表示文本串必须在一行的开头。所以,当查找行的开头只为“hosts”的行,可以使用命令:grep -ls '^hosts'
        * $:代表了一行的结尾。所以,当查找行的结尾只为“hosts”的行,可以使用命令:grep -ls 'hosts$'
        *   你可以在一个正则表达式中结合^和$,去查找仅仅包含"yes"的行,使用的命令为grep -ls '^yes$'
        * .: 一个可以指代除了换行符以外任意字符的通配符。为了查找包含tex、tux、tox或者tix的行,可以使用:grep -ls 't.x'
        * [ ]:表示在一个正则表达式中,方括号之间的字符是可选的。为了查找名字为pinda或者linda的用户,可以使用命令:grep -ls '[pl]inda'
        * [^ ]:忽略掉方括号中^之后的所有字符。为了查找包含文本linda的行,并忽略掉其中仅包含linda或者pinda的行,命令为:grep -ls '[^pl]inda'
        * -:代表一类或者一个范围内的字符。在像tr这样的命令中,这是非常有用的。以下的命令可以将所有的小写字母转为大写字母:tr a-z A-Z < mytext。同样地,你可以使用正则表达式grep -ls '^0-9'去查找其中有一些行是以数字开头的文件。
        * \< 和 \>:查找一个字的开头或者结尾的模式。查找行的开头的字以"san"为起始的命令为: grep \<SAN< code>。这些正则表达式有两个缺点—他们并不查找以指定的正则表达式开头的行,并且他们并不被所有的工具所支持。但是,vi和grep是支持这种用法的。
        * \:确保在正则表达式中有特殊含义的字符不被解释。查找以任何字符开始,后面跟着文本"host"的文本串的命令为grep -ls '.host'。而如果你需要查找以点为第一个字符,紧接着为"host"的文本串,可以用命令:grep -ls '\.host'

      这些正则表达式可以帮助您找到包含特定文本串的字。您也可以使用正则表达式去指定,在一个字中,该字符串出现的频率。比如,您可以使用正则表达式去搜索刚好包含用户名"linda"三次的文件。为了达到这一目的,您需要使用正则表达式的重复算子,并保证整个正则表达式位于引号中。没有引号的话,您可能会导致shell去解释您的重复算子。

      最重要的重复算子的列表如下:

        * *:表示前述的正则表达式可能出现一次、多次或者根本不出现。注意:不要和shell中的*混淆—在shell中,*表示任意字符,而在正则表达式中,*表示之前的正则表达式可能存在。
        * ?:表示在该位置可能是一个字符(但并不是必须是)。例如,同时查找color和colour的命令为:grep -ls 'colo.r'
        * +:表示之前的字符或者正则表达式至少要出现一次
        * \{n\}:表示之前的字符或者正则表达式至少要出现n次。当你查找一个介于100到999之间的数字时,这是很有用的:grep -ls '0-9\{3\}' 

      我们已经向您概述了正则表达式的使用方法。这可以让您在做一个管理员时,更加地有效率。正则表达式可以提供更多的功能,包括一些相当复杂的操作。但在之前,请首先掌握我们已经介绍的这些技能。正则表达式可以非常复杂,以至于你会很容易迷失其中。


    展开全文
  • sed中正则表达式的使用

    千次阅读 2018-09-10 09:13:15
    sed是linux下文本处理的一个非常重要的工具,可用于批量文本的查找和替换,也可以采用正则表达式格式。 正常用法 sed ‘s/pattern/replace_string/’ file 这个命令并不会直接替换file文件中的内容,只是会输出...

    sed是linux下文本处理的一个非常重要的工具,可用于批量文本的查找和替换,也可以采用正则表达式格式。

    1. 正常用法

      sed ‘s/pattern/replace_string/’ file

      这个命令并不会直接替换file文件中的内容,只是会输出替换后的内容。如果要实时替换生效,需要加上 -i 选项(in place的意思),即:
      sed -i ‘s/pattern/replace_string/’ file

    2. 高级用法
      采用正则表达式
      比如有一个文本init.xml中相关的配置选项:

      <root>
      <process>
      <!--
          进程信息:
              nickname:每个进程唯一对应的别名,用于区分各个进程;
      -->
          <!--1110 从编号0开始, [2-5]4个cpu --> 
          <!--1110 从编号0开始的[2,15] 14个cpu  24G--> 
          <item daemon="true"  nickname="p1" cpumask="E" TimeLimit="0" MemLimit="1048576">
              <ProName>program.exe</ProName>
              <Parameter></Parameter>
              <ProPath>/mnt/hgfs/version_1/bin/linux64/program.exe</ProPath>
              <szRunCmd><![CDATA[cd /mnt/hgfs/version_1/bin/linux64/&&./program.exe>/dev/null&]]></szRunCmd>
          </item> 
      </process> 
      <rule>
          <item relation="p1" restart="p1"></item>
      </rule>
      </root>

      需要把其中的的值替换为新的路径path,把的值替换为相应的路径值。

      sed -i “s?.+?progpathprog_exe?” config/Daemon.xml
      其中:
      .+ 表示任意字符
      类似的还有:\w+ 匹配包括下划线的任何单词字符
      ? 是分隔符,一般用/, 但如果正则中包含/, 则再用/作为分隔符,就需要转义,而且阅读不太直观;

      sed中用()括号括起来的正则匹配的子内容,可以用到替换字符串中,用\1,\2…来表示,
      还可以用$来表示整个匹配的内容。

    3. 骨灰用法

    如果要替换的内容,用共同的地方,则可以一次性替换所有的文件,避免逐个文件处理。
    例如:

    sed -i "s?$original_file_path?$file_path?" `grep $original_file_path -rl config/`

    config 目录下查找所有originalfilepathfile_path。

    展开全文
  • L27 linux正则表达式:sed用法详解

    千次阅读 2017-10-29 14:13:44
    grep工具的功能其实还不够...sed和awk工具就能实现把替换的文本输出到屏幕上的功能,而且还有其他更丰富的功能。sed和awk都是流式编辑器,是针对文档的行来操作的。 语法: sed [options] '命令' file(s) sed [opti

    grep工具的功能其实还不够强大,grep实现的只是查找功能,而它却不能实现把查找的内容替换掉。vim可以查找也可以替换,但是只局限于在文本内部来操作,而不能输出到屏幕上。sed和awk工具就能实现把替换的文本输出到屏幕上的功能,而且还有其他更丰富的功能。sed和awk都是流式编辑器,是针对文档的行来操作的。

    语法:

    sed [options] '命令' file(s)

    sed [options] -f scriptfile file(s)

    1.打印某行

    sed -n 'n'p filename 单引号内的n是一个数字,表示第几行:

    [root@greg-01 ~/sed]# sed -n '2'p passwd

    bin:x:1:1:bin:/bin:/sbin/nologin

    -n选项作用:只显示要打印的行,无关紧要的内容不显示

    要想把所有行都打印出来可以使用 sed -n '1,$'p filename

    也可以指定一个区间: sed -n '1,3'p filename

    2.打印包含某个字符串的行

    grep中使用的特殊字符,如 ^ $ . * 等同样也能在sed中使用

    [root@greg-01 ~/sed]# sed -n '/root/'p passwd

    root:x:0:0:root:/root:/bin/bash

    operator:x:11:0:operator:/root:/sbin/nologin

    [root@greg-01 ~/sed]# sed -n '/r*t/'p passwd

    3.-e可以实现多个行为

    [root@greg-01 ~/sed]# sed -e '1'p -e '/111/'p -n sed1.txt

    root:x:0:0:root:/rooot:/bin/bashlooov

    11111111111111111111111111111

    4.I不区分大小写

    5. 删除某行或者多行

    sed '1'd passwd

    sed '1,3'd passwd

    'd' 这个字符就是删除的动作了,不仅可以删除指定的单行以及多行,而且还可以删除匹配某个字符的行,另外还可以删除从某一行一直到文档末行。

    不过,这个操作仅仅是在显示屏幕上并不显示而已,文档还好好的。

    6.替换字符或字符串

    's' 就是替换的命令, 'g' 为本行中全局替换,如果不加 'g' 只换该行中出现的第一个。

    sed '1,2s/ot/to/g' sed1.txt

    -n选项和p命令一起使用表示只打印那些发生替换的行:

    sed -n 's/ot/to/p' sed1.txt

    除了可以使用 '/' 作为分隔符外,还可以使用其他特殊字符例如 '#' 或者 '@' 都没有问题。

    sed 's#ot#txxxxxxxxxxx#g' sed1.txt

    使用正则表达式把数字替换为空,等于删除所有数字

    sed 's/[0-9]//g' sed1.txt

    sed 's/[a-zA-Z]//g' sed1.txt

    7.调换两个字符串的位置

    用 () 把所想要替换的字符括起来成为一个整体,因为括号在sed中属于特殊符号,所以需要在前面加脱意字符 , 替换时则写成 '1', ''2', ''3' 的形式。

    [root@greg-01 ~/sed]# sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/' sed1.txt

    /bin/bashlooov:x:0:0:root:/rooot:root

    /sbin/nologin:x:1:1:bin:/bin:bin

    /sbin/nologin:x:2:2:daemon:/sbin:daemon

    roooot:x:3:4:adm:/var/adm:/sbin/nologin:operator

    11111111111111111111111111111

    aaaaaaaaaaaaaaaaaaaaaaaaaaaa

    \(..\) 用于匹配子串,对于匹配到的第一个子串就标记为 \1,依此类推匹配到的第二个结果就是 \2。使用-r可以省略转义字符。

    除了调换两个字符串的位置外,还可以在某一行前或者后增加指定内容。

    & 保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。

    8.直接修改文件的内容

    直接编辑文件选项-i,sed -i 's/ro/RORORORO/g' sed1.txt

    sed总结
    sed元字符(正则表达式)
    ^ 匹配行开始,如:/^sed/匹配所有以sed开头的行。 
    $ 匹配行结束,如:/sed$/匹配所有以sed结尾的行。 
    . 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。 
    * 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。 
    [] 匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed。 
    [^] 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。 
    \(..\) 匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。 
    & 保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。
    \< 匹配单词的开始,如:/\ 匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行。 
    x\{m\} 重复字符x,m次,如:/0\{5\}/匹配包含5个0的行。 
    x\{m,\} 重复字符x,至少m次,如:/0\{5,\}/匹配至少有5个0的行。
    x\{m,n\} 重复字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10个0的行。


    练习:
    把/etc/passwd 复制到/sed/passwd,用sed打印所有行 
    打印passwd的3到10行 
    sed -n '3,10'p passwd
    打印passwd 中包含 ‘root’ 的行 
    sed -n '/root/'p passwd
    删除passwd 的15行以及以后所有行 
    sed '15,$'d  passwd
    删除passwd中包含 ‘bash’ 的行 
    sed '/bash/'d passwd
    替换passwd 中 ‘root’ 为 ‘toor’ 
    sed 's/root/toor/g' passwd
    替换passwd中 ‘/sbin/nologin’ 为 ‘/bin/login’ 
    sed 's#sbin/nologin#bin/login#g' passwd
    删除passwd中5到10行中所有的数字 
    sed '5,10s/[0-9]//g' passwd
    删除passwd 中所有特殊字符(除了数字以及大小写字母) 
    sed 's/[^0-9a-zA-Z]//g' passwd
    把passwd中第一个单词和最后一个单词调换位置 
    sed 's/\(^[a-zA-Z][a-zA-Z]*\)\([^a-zA-Z].*\)\([^a-zA-Z]\)\([a-zA-Z][a-zA-Z]*$\)/\4\2\3\1/' passwd
    把passwd中出现的第一个数字和最后一个单词替换位置 
    sed 's#\([^0-9][^0-9]*\)\([0-9][0-9]*\)\([^0-9].*\)\([^a-zA-Z]\)\([a-zA-Z][a-zA-Z]*$\)#\1\5\3\4\2#' passwd
    把passwd 中第一个数字移动到行末尾 
    sed 's#\([^0-9][^0-9]*\)\([0-9][0-9]*\)\([^0-9].*$\)#\1\3\2#' passwd
    在passwd 20行到末行最前面加 ‘aaa:’ 
    sed 's/^.*$/&aaa/' passwd


    展开全文
  • 正则表达式之sed

    千次阅读 2018-01-17 00:02:41
    这里就需要用到sed以及awk命令了,他们能把替换的文本输出到屏幕上,而且还有其他丰富的功能。它们都是流式编辑器。是针对文本的行来进行操作的。 (1) 打印出包含指定字符串的行 sed -n '/root/'p test.txt /...
  • sed正则表达式

    千次阅读 2018-10-13 12:16:47
    9.4/9.5 sed sed sed 是一种新型的,非交互式的编辑器。它能执行与编辑器 vi 和 ex 相同的编辑任务。sed 编辑器没有提供交互式使用方式,使用者只能在命令行输入编辑命令、指定文件名,然后在屏幕上查看输出。sed ...
  • 1,删除文件每行的第一个字符:sed -r 's/^.//g' passwd2,删除文件每行的第二个字符:sed -r 's/^(.)(.)/\1/g' passwd3,删除文件每行的最后一个字符:sed -r 's/(.)$//g' 4,删除文件每行的倒数第二个字符: sed -r ...
  • Linux中使用grep正则提取字符串 echo office365 | grep -P '\d+' -o find . -name &amp;amp;quot;*.txt&amp;amp;quot; | xargs grep -P 'regex' -o xargs会将find结果作为grep的输入,防止find结果过多...
  • sed 正则替换

    万次阅读 2016-09-08 10:56:00
    1. Sed简介  sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕...
  • <p>this RegEx could match my case but i don't know how to use it with <code>sed</code>: ^(iconv\(\'GB2312\'\,\'UTF-8\'\,)+|(\))</code></p> <p>And i am also not sure that <code>sed</code> is the right...
  • sed正则表达式

    2017-10-30 16:58:37
    sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作,下面先了解一下sed的用法 sed命令行格式为: sed [-nefri] ‘command’ 输入...
  • sed是一种流编辑器,它是文本处理中非常有用的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为『模式空间』(pattern space),接着用sed命令处理缓冲区中的...
  • mac sed 正则表达式匹配空格

    千次阅读 2017-03-08 10:45:10
    mac sed 正则表达式匹配空格 [[:space:]]匹配空格和Tab #!/bin/sh basePath="/Users/whuanghkl/code/IdeaProjects/lanproxy" cd $basePath ConfigJavaFile="/Users/whuanghkl/code/...
  • sed 正则 ! 取反

    2019-07-23 03:39:08
    表示匹配不在x和y行号范围内的行,利用sed命令用于的阿银不在2-7之间的行 [111 sed]$ cat input 1 2 3 4 5 6 7 8 9 10 [111 sed]$ sed -n '2,7!p' input 1 8 9 10 x!表示匹配除了x行号外的...
  • sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容...
  • Linux查找文件并使用sed正则替换内容

    千次阅读 2019-05-02 18:15:08
    原文件 test.js,内容如下: module.exports = { serve: '... keys: ['some secret hurr'], session: { key: 'koa:sess' } } 要求替换其中serve后面的值,使用如下命令: # 先定义变量 ...
  • sed正则表达式最小匹配和最大匹配

    千次阅读 2009-01-03 16:58:00
    假设有这么一个字符串,一个URL地址:http://ftp.acc.umu.se/mirror/release/test.deb提取其中的路径部分:$ echo "http://ftp.acc.umu.se/mirror/release/test.deb" | sed -e "s#http:///(.*/)/.*#/1#g"RE:ftp.acc....
  • sed正则截取字符串的一些坑

    千次阅读 2017-08-10 09:47:28
    有json字符串{"sysmana": 10, "influxdb": 9}现在要在shell脚本中匹配出sysmana对应的数字。 number=`echo $str | sed 's/.*sysmana\": *\([0-9]\+\).*/\1/'` 坑: 1、sed正则中的空格就用空格表示...3、sed正则中的1或
  • [ ] 需要匹配的时候,需要转义(这个是叛徒) echo "[ ]"|sed 's/\[.*\]/aaa/g'( ) 需要匹配的时候,不要转义 $echo "( )"|sed 's/( )/c/g'{ } 需要匹配的时候,不要转义 $echo "{ }"|sed 's/{ }/c/g'当需要匹配数字,...
  • linux sed正则表达式

    千次阅读 2015-11-17 11:06:56
    1 正则表达式简介 正则表达式(Regular Expression)是一种描述文本(或字符串)模式的工具。正则表达式常用于查找文本的场合。想想一下我们日常生活中的例子,假如你想从电话本里找一个联系人的电话,而你又想不起...
1 2 3 4 5 ... 20
收藏数 36,414
精华内容 14,565
关键字:

sed正则