shell知识点:三剑客之sed

本文深入解析SED文本处理命令的使用方法,包括增加、插入、删除、替换等操作,以及如何利用正则表达式进行精确文本匹配和批量修改。通过实例演示SED在实际场景中的应用,如文本替换、行操作和文件另存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

知识点
  • 查看sed帮助

    man sed
    
  • 语法格式
    sed [options] [sed-commands] [input-file]

  • [sed-commands]命令
    a:增加
    i:插入
    d:删除
    c:按行替换
    s:文本替换:与g连用全局标志,与i连用匹配忽略大小写
    p:查询,与-n选项连用
    w:另存文件
    l:打印不可见字符
    q:退出sed
    n:清空当前模式空间,然后读入下一行
    N:不清空当前模式空间,然后读入下一行,以\n分隔两行

  • [options]命令
    -i:将修改的内容保存到文本中
    -r:启用扩展正则表达式
    -n:取消默认输出(默认输出所有行)
    -e:执行多条sed命令
    -f:后接sed脚本文件名

  • 指定执行的地址(行)范围
    第10行: 10{sed-commands}
    第10-20行: 10,20{sed-commands}
    10行后面20行: 10,+20{sed-commands}
    1,3,5,7…行: 1`2{sed-commands}
    2,4,6,8…行: 2`2{sed-commands}
    第10行到最后行: 10,${sed-commands}
    正则匹配包含zhangsan字符串行执行: /zhangsan/{sed-commands}
    正则匹配包含zhangsan字符串行到包含wangwu字符串行执行: /zhangsan/,/wangwu/{sed-commands}
    正则匹配包含zhangsan字符串行到结尾行执行: /zhangsan/,${sed-commands}
    正则匹配包含zhangsan字符串行到后面20行: /zhangsan/,+20{sed-commands}
    第10行到包含zhangsan字符串的最近的一行 10,/zhangsan/{sed-commands}

  • 特殊符号
    &:代表被替换的内容
    =:获取行号
    {}:合并执行命令

实例
  • 增加数据(a,i)
    第二行后面增加一行数据

    [root@localhost ~]# sed '2a 107,test,ccc' test.txt 
    100,zhangsan,CEO
    101,lisi,CTO
    107,test,ccc
    102,wangwu,COO
    103,xiaoming,CFO
    104,xiaohong,CIO
    105,wangba,CUO
    

    第二行后面增加多行数据

    [root@localhost ~]#  sed '2a 107,test,ccc\n108,test1,XXX' test.txt 
    100,zhangsan,CEO
    101,lisi,CTO
    107,test,ccc
    108,test1,XXX
    102,wangwu,COO
    103,xiaoming,CFO
    104,xiaohong,CIO
    105,wangba,CUO
    
    [root@localhost ~]# sed '2a 107,test,ccc\
    > 108,test1,XXX' test.txt  
    100,zhangsan,CEO
    101,lisi,CTO
    107,test,ccc
    108,test1,XXX
    102,wangwu,COO
    103,xiaoming,CFO
    104,xiaohong,CIO
    105,wangba,CUO
    

    第二行前面插入一行数据

    [root@localhost ~]# sed '2i 107,test,ccc' test.txt   
    100,zhangsan,CEO
    107,test,ccc
    101,lisi,CTO
    102,wangwu,COO
    103,xiaoming,CFO
    104,xiaohong,CIO
    105,wangba,CUO
    
  • 删除数据(d)
    删除第二行数据

    [root@localhost ~]# sed '2d'  test.txt 
    100,zhangsan,CEO
    102,wangwu,COO
    103,xiaoming,CFO
    104,xiaohong,CIO
    105,wangba,CUO
    

    删除2-4行数据

    [root@localhost ~]# sed '2,4d'  test.txt 
    100,zhangsan,CEO
    104,xiaohong,CIO
    105,wangba,CUO
    
    [root@localhost ~]# sed '2,+2d'  test.txt
    100,zhangsan,CEO
    104,xiaohong,CIO
    105,wangba,CUO
    
  • 行替换( c )
    将第二行数据替换

    [root@localhost ~]# sed '2c 1010,test,CCC' test.txt 
    100,zhangsan,CEO
    1010,test,CCC
    102,wangwu,COO
    103,xiaoming,CFO
    104,xiaohong,CIO
    105,wangba,CUO
    
  • 文本替换
    替换模型:sed -i ‘s#被替换字符串#替换字符串#g’ 输入流 或 sed -i ‘s/被替换字符串/替换字符串/g’ 输入流
    Ms# # #Ng:对M行操作,无g标志,对匹配的第1列处理,有g标志,对整行操作
    Ng:从第N处/列开始替换

    替换第2行,第2列开始字符串

    [root@localhost ~]# sed '2s#1#0#2g' num.txt   
    1 1 1 1
    1 0 0 0
    1 1 1 1
    1 1 1 1
    

    将zhangsan字符串替换为test字符串

    [root@localhost ~]# sed 's#zhangsan#test#g' test.txt 
    100,test,CEO
    101,lisi,CTO
    102,wangwu,COO
    103,xiaoming,CFO
    104,xiaohong,CIO
    105,wangba,CUO
    
  • 变量替换
    不能使用单引号(所见及所得),会将$x,$y当做字符串处理

    [root@localhost ~]# cat 1.txt 
    a
    b
    a
    [root@localhost ~]# x=a
    [root@localhost ~]# y=b
    [root@localhost ~]# sed 's#$x#$y#g' 1.txt       
    a
    b
    a
    [root@localhost ~]# sed s#$x#$y#g 1.txt 
    b
    b
    b
    [root@localhost ~]# sed "s#$x#$y#g" 1.txt 
    b
    b
    b
    [root@localhost ~]# sed 's#'$x'#'$y'#g' 1.txt   
    b
    b
    b
    [root@localhost ~]#  eval sed 's#$x#$y#g' 1.txt 
    b
    b
    b
    
  • 分组替换 () \1
    开机自启开启需要的服务

    [root@study ~]# chkconfig --list|grep 3:on|grep -vE "sshd|crond|network"|awk '{print $1}'|sed -r 's#(.*)#chkconfig \1 off#g' |bash
    
  • 特殊符号&,代表被替换的内容
    将1-5行中的x字符串替换为–x--字符串

    [root@localhost ~]# sed '1,5s#x#--&--#g' test.txt  
    100,zhangsan,CEO
    101,lisi,CTO
    102,wangwu,COO
    103,--x--iaoming,CFO
    104,--x--iaohong,CIO
    105,wangba,CUO
    
  • 特殊符号=,显示行号

    [root@localhost ~]# sed '=' test.txt 
    1
    100,zhangsan,CEO
    2
    101,lisi,CTO
    
    [root@localhost ~]# sed '=' test.txt |sed 'N;s#\n# #'
    1 100,zhangsan,CEO
    2 101,lisi,CTO
    3 102,wangwu,COO
    4 103,xiaoming,CFO
    5 104,xiaohong,CIO
    6 105,wangba,CUO
    

    每行前后加上–字符

    [root@localhost ~]# sed  -r 's#(.*)#---&-#g' test.txt 
    ---100,zhangsan,CEO-
    ---101,lisi,CTO-
    ---102,wangwu,COO-
    ---103,xiaoming,CFO-
    ---104,xiaohong,CIO-
    ---105,wangba,CUO-
    

    对2,4行先执行打印,然后在显示行号

    [root@localhost ~]# sed -n '2,4{p;=}' test.txt 
    101,lisi,CTO
    2
    102,wangwu,COO
    3
    103,xiaoming,CFO
    4
    

    等同于

    [root@localhost ~]# sed -n '2,4p;2,4=' test.txt   
    101,lisi,CTO
    2
    102,wangwu,COO
    3
    103,xiaoming,CFO
    4
    
  • 输出指定的第二行(p,-n)

    [root@localhost ~]# sed  -n '2p' test.txt  
    101,lisi,CTO
    
  • 另存文件(w)
    将test.txt文件另存为2.txt

    [root@localhost ~]# sed 'w 2.txt' test.txt 
    100,zhangsan,CEO
    101,lisi,CTO
    102,wangwu,COO
    103,xiaoming,CFO
    104,xiaohong,CIO
    105,wangba,CUO
    [root@localhost ~]# ll
    total 12
    -rw-r--r--. 1 root root 94 Nov 21 03:51 2.txt
    -rw-r--r--. 1 root root 94 Nov 20 23:40 test.txt
    
  • 一条sed语句执行多条sed命令
    删除第4行到末尾的数字,并把10替换为01

    [root@localhost ~]# sed  '4,$d' test.txt| sed  's#10#01#g'
    010,zhangsan,CEO
    011,lisi,CTO
    012,wangwu,COO
    
    [root@localhost ~]# sed -e '4,$d' -e 's#10#01#g' test.txt      
    010,zhangsan,CEO
    011,lisi,CTO
    012,wangwu,COO
    
    [root@localhost ~]# sed  '4,$d;s#10#01#g' test.txt         
    010,zhangsan,CEO
    011,lisi,CTO
    012,wangwu,COO
    
  • 打印不可见字符

    [root@localhost ~]# sed -n 'l' test.txt 
    100,zhangsan,CEO$
    101,lisi,CTO$
    102,wangwu,COO$
    103,xiaoming,CFO$
    
  • 模拟其它命令
    cat

    [root@localhost ~]# sed '' test.txt 
    100,zhangsan,CEO
    101,lisi,CTO
    

    grep

    [root@localhost ~]# sed -n '/zhangsan/p' test.txt    
    100,zhangsan,CEO
    

    grep -v

    [root@localhost ~]# sed -n '/zhangsan/!p' test.txt  
    101,lisi,CTO
    102,wangwu,COO
    103,xiaoming,CFO
    104,xiaohong,CIO
    105,wangba,CUO
    

    head

    [root@localhost ~]# sed -n '1,2p' test.txt 
    100,zhangsan,CEO
    101,lisi,CTO
    
    [root@localhost ~]# sed  '3,$d' test.txt      
    100,zhangsan,CEO
    101,lisi,CTO
    

    wc

    [root@localhost ~]# sed  -n '$=' test.txt  
    6
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值