精华内容
下载资源
问答
  • linux sed命令详解

    2017-12-15 10:27:45
    linux sed命令详解
  • linux sed 命令详解

    2010-12-20 22:32:25
    linux sed 命令详解 资源收集 linux sed 命令详解 资源收集
  • Linux Sed命令详解

    2019-04-16 18:19:56
    Linux Sed命令详解 参考文章:https://www.cnblogs.com/ftl1012/p/sed.html

    Linux Sed命令详解

    参考文章:https://www.cnblogs.com/ftl1012/p/sed.html

    展开全文
  • Linux sed命令详解

    2020-04-04 21:08:45
    Linux sed命令详解 sed是一个“非交互式的”面向字符流的编辑器。能同时处理多个文件多行的内容,可以不对原文件改动,把整个文件输入到屏幕,可以把只匹配到模式的内容输入到屏幕上。还可以对原文件改动,但是不会再...

    Linux sed命令详解

    sed是一个“非交互式的”面向字符流的编辑器。能同时处理多个文件多行的内容,可以不对原文件改动,把整个文件输入到屏幕,可以把只匹配到模式的内容输入到屏幕上。还可以对原文件改动,但是不会再屏幕上返回结果。

    语法

    sed  [options]  ‘sed command’ filename(s)
    sed  [options]  -f  ‘sed scriptfile’   filename(s)
    

    sed命令选项(option):
    -n :只打印模式匹配的行
    -e :直接在命令行模式上进行sed动作编辑,此为默认选项
    -f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作
    -r :支持扩展表达式
    -i :直接修改文件内容
    命令:

    命令 说明
    d 删除,删除选择的行
    D 删除模块的第一条
    s 替换指定字符
    h 拷贝模块内容到内存中的缓冲区
    H 追加模块内容到内存中的缓冲区
    g 获得内存缓冲区的内容,并代替当前模块中的文本
    G 获得内存缓冲区的内容,并追加到当前模块文本的后面
    l 列表不能打印字符的清单
    n 读取下一个输入行,用下一个命令处理新的行而不是第一个命令
    N 追加下一个输入行到模块后面并在二者之间嵌入一个新行,改变当前行号码
    p 打印模块的行
    P 打印模块的第一行
    q 退出sed
    b label 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾
    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的行
    (…) 匹配字符串,保存匹配的字符,如:(love)able/\1rs,loveable被替换成lovers
    < 匹配单词的开始,如:/<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的行

    Sed各种事例:
    测试文件为:

    [root@localhost ~]# cat qq.txt 
    my cat's name is betty 
    This is your dog 
    my dog's name is frank 
    This is your fish 
    my fish's name is george 
    This is your goat 
    my goat's name is adam
    

    事例1:
    S命令:替换指定字符
    sed ‘s/This/aaa/’ qq.txt

    [root@localhost ~]# cat qq.txt 
    my cat's name is betty 
    This is your dog 
    my dog's name is frank 
    This is your fish 
    my fish's name is george 
    This is your goat 
    my goat's name is adam
    [root@localhost ~]# sed 's/This/aaa/' qq.txt
    my cat's name is betty 
    aaa is your dog 	//替换后,This替换为aaa
    my dog's name is frank 
    aaa is your fish 
    my fish's name is george 
    aaa is your goat 
    my goat's name is adam
    

    事例2:
    -n选项和p命令一起使用表示只打印那些发生替换的行:
    sed -n ‘s/This/aaa/p’ qq.txt

    [root@localhost ~]# sed -n 's/This/aaa/p' qq.txt
    aaa is your dog 
    aaa is your fish 
    aaa is your goat 
    

    事例3:
    直接编辑文件选项-i,会匹配qq.txt文件中每一行的第一个aaa替换为this:
    sed -i ‘s/This/this/’ qq.txt

    [root@localhost ~]# sed -i 's/This/this/' qq.txt
    [root@localhost ~]# cat qq.txt 
    my cat's name is betty 
    this is your dog 
    my dog's name is frank 
    this is your fish 
    my fish's name is george 
    this is your goat 
    my goat's name is adam
    
    

    事例4:
    打印文件中的第二行,第二行会打印两遍,sed默认会打印所有行。

    [root@localhost ~]# sed '2p' qq.txt
    my cat's name is betty 
    this is your dog 
    this is your dog 
    my dog's name is frank 
    this is your fish 
    my fish's name is george 
    this is your goat 
    my goat's name is adam
    
    
    

    事例5:
    使用-n选项表示只打印匹配的行

    [root@localhost ~]# sed -n '2p' qq.txt 
    this is your dog 
    

    事例6:
    打印文件的第一到第三行。

    [root@localhost ~]# sed -n '1,3p' qq.txt 
    my cat's name is betty 
    this is your dog 
    my dog's name is frank 
    

    事例7:
    表示打印文件中匹配dog字符的行。

    [root@localhost ~]# sed -n '/dog/p' qq.txt 
    this is your dog 
    my dog's name is frank 
    

    事例8:
    打印文件中从匹配adam的行到第四行,adam所处的行如果在第四行之后,则表示仅打印匹配adam的行。如果adam正好在第四行,则只打印这一行。

    [root@localhost ~]# sed -n '/adam/,4p' qq.txt 
    my goat's name is adam
    

    事例9:
    打印从第一行开始匹配到第一次出现dog字符的行,dog字符行也打印。

    [root@localhost ~]# sed -n '1,/dog/p' qq.txt 
    my cat's name is betty 
    this is your dog 
    

    事例10:
    打印文件中第一行到第四行的内容,且打印行号,当用到sed不同的编辑命令时,用{},且不同编辑命令之间用分号隔开。

    [root@localhost ~]# sed -n '1,4{=;p}' qq.txt 
    1
    my cat's name is betty 
    2
    this is your dog 
    3
    my dog's name is frank 
    4
    this is your fish 
    
    

    事例11:
    用!表示对前面的匹配的模式取反。

    [root@localhost ~]# sed -n '1,4!{=;p}' qq.txt 
    5
    my fish's name is george 
    6
    this is your goat 
    7
    my goat's name is adam
    
    

    事例12:
    sed的匹配模式支持正则表达式
    打印前5行

    [root@localhost ~]# sed '5q' /etc/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
    

    打印匹配r有0个或者多个,后接一个t字符的行

    [root@localhost ~]# sed -n '/r*t/p' /etc/passwd		
    root:x:0:0:root:/root:/bin/bash
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    operator:x:11:0:operator:/root:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    rtkit:x:499:499:RealtimeKit:/proc:/sbin/nologin
    avahi-autoipd:x:170:170:Avahi IPv4LL 
    

    打印匹配有r的行并且r后面跟任意字符

    [root@localhost ~]# sed -n '/.r.*/p' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    

    打印o字符重复任意次的行

    [root@localhost ~]# sed -n '/o*/p' /etc/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
    uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
    

    打印o字重复出现一次以上的行

    [root@localhost ~]# sed -n '/o\{1,\}/p' /etc/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
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    

    打印o字重复出现一次到三次之间以上 的行

    [root@localhost ~]# sed -n '/o\{1,3\}/p' /etc/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
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    

    事例13:
    打印出以#开头的行,然后用!进行反选,则表示过滤掉以#开头的行,不会过滤掉空格。

    [root@localhost ~]# sed -n '/^#/!p' /etc/ntp.conf 
    
    driftfile /var/lib/ntp/drift
    
    restrict default kod nomodify notrap nopeer noquery
    restrict -6 default kod nomodify notrap nopeer noquery
    
    restrict 127.0.0.1 
    restrict -6 ::1
    
    
    server 0.centos.pool.ntp.org iburst
    server 1.centos.pool.ntp.org iburst
    server 2.centos.pool.ntp.org iburst
    server 3.centos.pool.ntp.org iburst
    
    
    
    includefile /etc/ntp/crypto/pw
    
    keys /etc/ntp/keys
    
    
    
    
    server ntp.ntsc.ac.cn iburst
    
    

    事例14:
    匹配以#开头的行,进行反取,则打印出非#开头的行,然后其结果在对空格开头的去反,表示过滤掉以#和空格开头的行。

    [root@localhost ~]# sed -n '/^#/!{/^$/!p}' /etc/ntp.conf 
    driftfile /var/lib/ntp/drift
    restrict default kod nomodify notrap nopeer noquery
    restrict -6 default kod nomodify notrap nopeer noquery
    restrict 127.0.0.1 
    restrict -6 ::1
    server 0.centos.pool.ntp.org iburst
    server 1.centos.pool.ntp.org iburst
    server 2.centos.pool.ntp.org iburst
    server 3.centos.pool.ntp.org iburst
    includefile /etc/ntp/crypto/pw
    keys /etc/ntp/keys
    server ntp.ntsc.ac.cn iburst
    

    事例15:
    删除匹配以#开头的行,删除匹配空格的行(sed支持对单个文件实现不同的操作,每个操作用-e参数)

    [root@localhost ~]# sed -e '/^#/d' -e '/^$/d' /etc/ntp.conf 
    driftfile /var/lib/ntp/drift
    restrict default kod nomodify notrap nopeer noquery
    restrict -6 default kod nomodify notrap nopeer noquery
    restrict 127.0.0.1 
    restrict -6 ::1
    server 0.centos.pool.ntp.org iburst
    server 1.centos.pool.ntp.org iburst
    server 2.centos.pool.ntp.org iburst
    server 3.centos.pool.ntp.org iburst
    includefile /etc/ntp/crypto/pw
    keys /etc/ntp/keys
    server ntp.ntsc.ac.cn iburst
    

    事例16:
    打印匹配adm的行到第六行

    [root@localhost ~]# sed -n '/adm/,6p' /etc/passwd
    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
    

    事例17:
    匹配dog字符的行,行首添加nihao这个字符。

    [root@localhost ~]# sed '/dog/s/^/nihao/' qq.txt 
    my cat's name is betty 
    nihaothis is your dog 
    nihaomy dog's name is frank 
    this is your fish 
    my fish's name is george 
    this is your goat 
    my goat's name is adam
    

    事例18:
    匹配adam字符,在这个字符前面添加qq

    [root@localhost ~]# sed 's/adam/qq &/' qq.txt 
    my cat's name is betty 
    this is your dog 
    my dog's name is frank 
    this is your fish 
    my fish's name is george 
    this is your goat 
    my goat's name is qq adam
    

    事例19:
    匹配adam字符,在这个字符后面添加qq

    [root@localhost ~]# sed 's/adam/& qq/' qq.txt 
    my cat's name is betty 
    this is your dog 
    my dog's name is frank 
    this is your fish 
    my fish's name is george 
    this is your goat 
    my goat's name is adam qq
    

    事例20:
    Sed的删除操作是针对文件的行,如果想删除行中的某个字符,可以使用替换。

    [root@localhost ~]# cat myfile  //文件内容
    sed command
    #hellow world tail and tail
    #hellow world tail and tail
    #how are you End
    i am fine End
    thanks, and you End
    sed command end
    
    [root@localhost ~]# sed '/^#/!d' myfile 	//删除以非#开头的行,即显示以#开头的行 
    #hellow world tail and tail
    #hellow world tail and tail
    #how are you End
    
    [root@localhost ~]# sed '2,4d' myfile 		//删除文件指定的行
    sed command
    i am fine End
    thanks, and you End
    sed command end
    
    [root@localhost ~]# sed '/thanks/d' myfile		//删除匹配thanks的行 
    sed command
    #hellow world tail and tail
    #hellow world tail and tail
    #how are you End
    i am fine End
    sed command end
    
    [root@localhost ~]# sed -i -e '/sed/d' -e '/^#/d' myfile 		//-i参数直接对文件进行操作,当需要删除多种不同模式的匹配时,可以使用-e参数
    [root@localhost ~]# cat myfile 
    i am fine End
    thanks, and you End
    

    sed替换操作

    [root@localhost ~]# cat test 	//源文件
    anonymous_enable=YES  
    write_enable=YES  
    local_umask=022  
    xferlog_enable=YES  
    connect_from_port_20=YES  
    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  
    DEVICE="eth0"  
    BOOTPROTO="static"  
    HWADDR="00:0C:29:90:79:78"  
    ONBOOT="yes"  
    IPADDR=172.16.22.1  
    NETMASK=255.255.0.0  
    
    [root@localhost ~]# sed -i '/DEVICE/c\Ethernet' test		//匹配DEVICE的行,替换成Ethernet这行		
    [root@localhost ~]# sed -i 's/static/dhcp/' test	//把static替换成dhcp 
    [root@localhost ~]# sed -i '/IPADDR/s@22\.1@10.12@' test 	//匹配IPADDR的行,把22.1替换成10.12由于.号有特殊意义所有需要转义(/,@,#都是前面所说的地址定界符)  
    [root@localhost ~]# sed -i '/connect/s#YES#NO#' test	//匹配connect的行,把YES替换成NO 
    [root@localhost ~]# sed -i 's/bin/tom/2g' test	//把所有匹配到bin的行中第二次及第二次之后出现bin替换成tom 
    [root@localhost ~]# sed -i 's/daemon/jerry/2p' test	//把所有匹配到bin的行中第二次出现的daemon替换成jerry,并在生产与匹配行同样的行 
    [root@localhost ~]# sed -i 's/adm/boss/2' test		//把所有匹配到adm的行中仅仅只是第二次出现的adm替换成boss 
    [root@localhost ~]# sed -i '/root/{s/bash/nologin/;s/0/1/g}' test		//匹配root的行,把bash替换成nologin,且把0替换成1
    [root@localhost ~]# sed -i 's/root/(&)/g' test		//把root用括号括起来,&表示引用前面匹配的字符 
    [root@localhost ~]# sed -i 's/BOOTPROPO/#BOOTPROTO/' test		//匹配BOOTPROTO替换成#BOOTPROTO,在配置文件中一般用于注释某行
    [root@localhost ~]# sed -i 's/NOBOOT/#&/' test		//匹配ONBOOT的行的前面添加#号,在配置文件中也表示注释某行 
    [root@localhost ~]# sed -i 's/NOBOOT/s/#//' test		//匹配ONBOOT的行,把#替换成空,即去掉#号,也一般用作去掉#注释		
    
    #-------------执行以上sed命令之后文件显示的内容-----------
    [root@localhost ~]# cat test 
    anonymous_enable=YES  
    write_enable=YES  
    local_umask=022  
    xferlog_enable=YES  
    connect_from_port_20=NO  
    (root):x:1:1:(root):/(root):/bin/nologin  
    bin:x:1:1:tom:/tom:/stom/nologin  
    daemon:x:2:2:jerry:/sbin:/stom/nologin  
    daemon:x:2:2:jerry:/sbin:/stom/nologin  
    adm:x:3:4:boss:/var/adm:/sbin/nologin  
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin  
    Ethernet
    #BOOTPROTO="dhcp"  
    HWADDR="00:0C:29:90:79:78"  
    ONBOOT="yes"  
    IPADDR=172.16.10.12  
    NETMASK=255.255.0.0  
    
    展开全文
  • Linux sed 命令详解

    2020-01-28 20:15:08
    Linux sed 命令定义工作方式使用行号定位文本行sed 命令的基本语法替换文本删除文本追加文本插入文本组合命令使用 -e 选项执行多个子命令使用分号执行多个子命令对一个地址使用多个子命令sed 脚本文件sed中 y 命令与...

    定义

    sed 命令是将一系列的编辑命令应用于一批文本的理想工具。sed 命令拥有非交互式和高效的特点。

    它可以对来自文本文件以及标准输入的文本进行编辑。其中,标准输入可以是来自键盘、文件重定向、字符串、变量或者是管道的文本。

    sed 命令会从文件或者标准输入中一次读取一行数据,将其复制到缓冲区,然后读取命令行或者脚本的编辑子命令,对缓冲区中的文本行进行编辑。重复此过程,一直到所有的文本行都处理完毕。
    在这里插入图片描述

    sed 命令的基本语法如下:

    sed [options] [script] [inputfile...]
    在这里插入图片描述

    工作方式

    (1)首先,用户可以在命令行直接执行 sed 命令,其基本语法如下:
    sed [options] commands inputfile

    (2)其次,用户可以将 sed 操作命令写入脚本文件,然后通过 sed 命令读取该文件并且执行其中的命令,其基本语法如下:
    sed [options] -f script inputfile

    (3)最后,用户通过将 sed 的操作命令写入文件,然后将该脚本文件授予用户执行权限,其基本语法如下:
    ./script inputfile

    其中,script 代表保存 sed 命令的脚本文件。在脚本文件中,用户应该在 #! 符号后面执行该脚本的解释器,因此在这种方式下,sed 脚本文件的第一行应该如下:
    #! /bin/sed

    使用行号定位文本行

    定位某个特定的行,语法如下: x

    定位某段连续的行,语法如下: x,y

    指定起始行和步长: first~step

    指定文件的第一行和最后一行

    • 第1行:1
    • 最后1行:$

    指定某行后面的几行,语法如下: x,+n

    使用正则表达式定位文本行:

    除了使用行号定位文本行之外,sed 命令还支持正则表达式定位。sed 命令中,正则表达式的语法如下:
    /regexp/
    在这里插入图片描述

    除了定位参数之外,sed 命令的另外一个组成部分就是编辑命令。常用的编辑命令有打印、插入、删除以及替换等。

    sed 命令的基本语法

    [address1[,address2]] command [argument]

    a\ 在当前行下面插入文本。
    i\在当前行上面插入文本。
    c\ 把选定的行改为新的文本。
    d删除,删除选择的行。
    D 删除模板块的第一行。
    s 替换指定字符
    h 拷贝模板块的内容到内存中的保持缓冲区,覆盖。
    H追加模板块的内容到内存中的保持缓冲区,追加。
    g 获得内存缓冲区的内容,并替代当前模板块中的文本。
    G 获得内存缓冲区的内容,并追加到当前模板块文本的后面。
    l 列表不能打印字符的清单。
    n 读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
    N 追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
    p 打印模板块的行。
    P(大写) 打印模板块的第一行。
    q 退出 Sed。
    r file 从file中读行。
    w file 写并追加模板块到 file 末尾。
    W file 写并追加模板块的第一行到 file 末尾。
    !表示后面的命令对所有没有被选定的行发生作用。
    = 打印当前行号码。

    在sed命令中,选择文本行主要通过位置参数来完成,基本语法如下:
    [address1[,address2]] p
    在上面的语法中,address1 和 address2都是位置参数。如果省略位置参数,则表示选择整个文件。子命令 p 表示将缓冲区中的文本行执行输出操作,即打印(print)缓冲区中的文本。

    【例1】演示使用行定位方法来选择输出某些文本行

    #! /bin/bash
    #输出1~3行,不使用-n选项
    sed '1,3p' students.txt
    echo "===================================="
    #输出1~3行,使用-n选项, -n或--quiet:仅显示script处理后的结果;
    sed -n '1,3p' students.txt
    
    [root@linux chapter10]# ./ex10-1.sh 
    200200110       	Abdul
    200200110       	Abdul
    200200164       	Abram
    200200164       	Abram
    200200167       	Bartley
    200200167       	Bartley
    200200168       	Bennett
    200200172       	Cecil
    200200173       	John
    200200187       	Cat
    ====================================
    200200110       	Abdul
    200200164       	Abram
    200200167       	Bartley
    

    【例2】演示使用正则表达式来作为定位参数

    #! /bin/bash
    #使用正则表达式定位
    result=`sed -n '/^20020017/ p' students.txt`
    echo "$result"
    
    [root@linux chapter10]# ./ex10-2.sh 
    200200172       	Cecil
    200200173       	John
    

    替换文本

    文本的替换需要使用 s 子命令,其语法如下:
    [address1[ ,address2]] s/pattern/replacemen/[flag]

    在上面的语法中,address1 与 address2 都是位置参数,关于它们的用法请参见前面的几个小节。在 s 命令中,位置参数通常会被省略,表示在所有的文本行中进行替换操作,其语法如下:
    s/pattern/replacemen/[flag]

    s 子命令表示执行替换(substitute)操作。pattern 为使用正则表达式表示的匹配模式,replacement 为用来替换的由一般字符组成的字符串。
    【例3】演示使用s子命令替换文本的方法

    #! /bin/bash
    echo "substitute the first pattern."
    #只将每行中第1次出现的小写字母e替换为大写字母E
    result=`sed 's/e/E/' students.txt`
    echo "$result"
    echo "substitute all the patterns."
    #将每一处的小写字母e都替换为大写字母E
    result=`sed 's/e/E/g' students.txt`
    echo "$result"
    

    【例4】使用行号定位方法来定位文本行

    #! /bin/bash
    #替换第1~3行中的所有的小写字母e为大写字母E
    result=`sed '1,3 s/e/E/g' students.txt`
    echo "$result"
    
    [root@linux chapter10]# ./ex10-4.sh 
    200200110       	Abdul
    200200164       	Abram
    200200167       	BartlEy
    200200168       	Bennett
    200200172       	Cecil
    200200173       	John
    200200187       	Cat
    

    【例5】演示通过两种方式来定位文本行

    #! /bin/bash
    #使用混合位置参数
    result=`sed '1,/^200200167/ s/e/E/g' students.txt`
    echo "$result"
    
    [root@linux chapter10]# ./ex10-4.sh 
    200200110       	Abdul
    200200164       	Abram
    200200167       	BartlEy
    200200168       	Bennett
    200200172       	Cecil
    200200173       	John
    200200187       	Cat
    

    【例10-6】演示通过两种方式来定位文本行

    #! /bin/bash
    #将文件中的HTML标记替换为空
    result=`sed 's/<[^>]*>//g' html.txt`
    echo "$result"
    
    [root@linux chapter10]# ./ex10-6.sh 
     
    view(1881) 
    review(5) 
    score
    

    【例10-7】演示&符号的使用方法

    #! /bin/bash
    #引用与模式相匹配的子串
    result=`sed 's/string/long &/' demo1.txt`
    echo "$result"
    
    [root@linux chapter10]# ./ex10-7.sh 
    This is a long string.
    

    【例10-8】演示使用\n的形式来引用模式中子串

    #! /bin/bash
    #通过数字来引用模式中的子串
    result=`sed 's/\(This\) \(is\) \(a\) \(string\)/\2 \1 \3 \4/' demo1.txt`
    echo "$result"
    
    [root@linux chapter10]# ./ex10-8.sh 
    is This a string.
    

    删除文本

    sed 提供了 d 子命令来实现文本行的删除(delete),其语法如下:
    [address1[ ,address2]] d

    在上面的语法中,2个位置参数的涵义以及用法请参见前面的内容。命令d表示删除位置参数指定的行。如果省略位置参数,则表示删除文本文件中的所有的行。在执行删除操作时,sed 命令的会首先读取一行文本到缓冲区,然后将符合位置参数的文本行删除,接着再读取并处理下一行。下面的例子演示了如何删除指定的文本行。
    【例9】通过sed命令删除指定的文本行

    #! /bin/bash
    #删除第1行
    result=`sed -e '1 d' students.txt`
    echo "$result"
    
    [root@linux chapter10]# ./ex10-9.sh 
    200200164       	Abram
    200200167       	Bartley
    200200168       	Bennett
    200200172       	Cecil
    200200173       	John
    200200187       	Cat
    

    【例10】演示删除文本文件最后一行的方法

    #! /bin/bash
    #删除最后一行
    result=`sed -e '$ d' students.txt`
    echo "$result"
    
    [root@linux chapter10]# ./ex10-10.sh 
    200200110       	Abdul
    200200164       	Abram
    200200167       	Bartley
    200200168       	Bennett
    200200172       	Cecil
    200200173       	John
    

    【例11】演示sed命令中文本行的不同定位方法

    #! /bin/bash
    #删除1~4行
    result=`sed -e '1,4 d' students.txt`
    echo "$result"
    echo "==============================="
    #删除奇数行
    result=`sed -e '1~2 d' students.txt`
    echo "$result"
    echo "=============================="
    #删除偶数行
    result=`sed -e '0~2 d' students.txt`
    echo "$result"
    echo "============================="
    #删除从第1行开始,一直到以200200172开头的行
    result=`sed -e '1,/^200200172/ d' students.txt`
    echo "$result"
    echo "============================"
    #删除从第4行开始,一直到最后一行的所有行
    result=`sed '4,$ d' students.txt`
    echo "$result"
    
    [root@linux chapter10]# ./ex10-11.sh 
    200200172       	Cecil
    200200173       	John
    200200187       	Cat
    ===============================
    200200164       	Abram
    200200168       	Bennett
    200200173       	John
    ==============================
    200200110       	Abdul
    200200167       	Bartley
    200200172       	Cecil
    200200187      	Cat
    =============================
    200200173       	John
    200200187       	Cat
    ============================
    200200110       	Abdul
    200200164       	Abram
    200200167       	Bartley
    

    追加文本

    所谓追加文本,是指将某些文本插入到某个位置的后面。sed 命令提供了 a 子命令来实现文本的追加(append),其基本语法如下:
    [address1] a string

    从上面的语法可以得知,子命令 a 最多只能使用一个位置参数。参数 string 表示将要追加的文本。a 子命令会将string代表的文本插入到 address1 所表示的位置的后面。这一点也是追加文本与后面将要介绍的插入文本的区别。
    【例12】演示通过sed命令追加文本的方法

    #! /bin/bash
    #在第2行后面追加文本
    result=`sed '2 a 200200109      Tom' students.txt`
    echo "$result"
    
    [root@linux chapter10]# ./ex10-12.sh 
    200200110       	Abdul
    200200164       	Abram
    200200109       	Tom
    200200167       	Bartley
    200200168       	Bennett
    …
    

    【例13】通过正则表达式指定追加文本的位置

    #! /bin/bash
    #在以200200110开头的文本行后面追加文本
    result=`sed '/^200200110/ a 200200109    Tom' students.txt`
    echo "$result"
    
    [root@linux chapter10]# ./ex10-13.sh 
    200200110       	Abdul
    200200109       	Tom
    200200164       	Abram
    200200167       	Bartley
    …
    

    插入文本

    插入文本的操作与追加文本非常相似,只是插入的位置不同。追加文本是在位置参数指定的位置的后面插入文本,而插入文本则是位置参数指定的位置的前面插入文本。在 sed 命令中,子命令i用来实现文本的插入,其语法如下:
    [address1] i string

    与子命令 a 一样,子命令i也是最多只能使用一个位置参数。位置参数 address1 用来指定要插入文本的位置,子命令i表示当前的操作是插入文本,参数 string 表示将要被插入的文本。

    【例14】演示通过sed命令插入文本的方法

    #! /bin/bash
    #在第二行文本前面插入文本
    result=`sed '2 i 200200109      Tom' students.txt`
    echo "$result"
    
    [root@linux chapter10]# ./ex10-14.sh 
    200200110       	Abdul
    200200109       	Tom
    200200164       	Abram
    …
    

    组合命令

    sed 命令支持将多个子命令组合在一起使用,这一点非常重要,因为在通常情况下,用户需要对文本进行多个不同的操作。如果不支持组合命令的话,则需要使用多个 sed 命令来完成;如果使用组合命令,则可以在一条 sed 命令中将这些操作完成。

    使用 -e 选项执行多个子命令

    sed 命令的 -e 选项可以使得 sed 将跟在其后面的字符串作为子命令执行。在前面的绝大部分例子中,由于都是一个子命令,所以将该选项省略。但是,如果想要为 sed 命令同时指定多个子命令,则必须使用多个 -e 选项。

    【例15】演示sed命令-e选项的使用方法

    #! /bin/bash
    #将所有的小写字母e替换为大写字母,然后打印2~3行
    result=`sed -n -e 's/e/E/g' -e '2,3 p' students.txt`
    echo "$result"
    
    [root@linux chapter10]# ./ex10-15.sh 
    200200164       	Abram
    200200167       	BartlEy
    

    使用分号执行多个子命令

    用户还可以使用分号来将各个子命令隔开,其语法如下:
    sed -e 'command1;command2...' filename

    其中,command1 以及 command2 等表示多个子命令,这些子命令之间用分号隔开。filename 参数表示要处理的文本文件。

    【例16】演示通过分号执行多个子命令的方法

    #! /bin/bash
    #使用分号隔开多个子命令
    result=`sed -e 's/e/E/g;2 i 200100001    Ellen' students.txt`
    echo "$result"
    
    [root@linux chapter10]# ./ex10-16.sh 
    200200110       	Abdul
    200100001        	Ellen
    200200164       	Abram
    200200167       	BartlEy
    200200168       	BEnnEtt
    200200172       	CEcil
    200200173       	John
    200200187       	Cat
    

    对一个地址使用多个子命令

    在某些情况下,用户需要对同一个地址使用多个子命令,例如,对某个文件的前20行进行多次替换操作等。sed 命令提供了对同一个地址使用多个子命令的语法,如下:

    address {
       command1
       command2
       command3
    …
    }
    

    【例17】演示对同一个地址使用多个子命令的方法

    #! /bin/bash
    #组合命令
    result=`sed -n '1,5 {
      s/e/E/g
      s/a/A/g
      2 i 201303009 Tom
      p
    }' students.txt`
    echo "$result"
    

    sed 脚本文件

    sed提供了-f选项,通过这个选项,sed命令可以从指定的脚本文件中读取子命令,然后对每个文本行依次执行各个子命令,其语法如下:
    sed -f script

    其中,script 表示 sed 脚本文件。
    sed脚本的语法比较简单,就是将各个子命令依次列出来,不必使用引号。如果将多条子命令写在同一行中,需要使用分号将其隔开。另外,sed 脚本文件支持代码注释,如果某一行以 # 开头,则表示该行为注释。sed 脚本的注释仅限于行注释,不能跨行。

    sed中 y 命令与 s 命令的区别

    (1)y 一般是行级别的替换,s 一般是列级别替换(当然也可以转换成行级);
    (2)s 替换的是整体,y 替换的是每一字母对应的单个字母
    例:
    1、sed 's/dog/cat/' data 把 data 中的所有行中的第一次出现 dog 的替换成 cat,(注意:如果 cat/ 后没有出现其他形式,则默认时第一次出现的位置)

    2、sed '1,3y/abc/ABC/' data 把 data 中的第一行至第三行中的 a 替换成 A,b 替换成B,c 替换成 C

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,200
精华内容 4,480
关键字:

linuxsed命令详解

linux 订阅