zoukankan      html  css  js  c++  java
  • sed强大的固定替换格式

    转自   http://blog.uouo123.com/post/704.html

    Linux之sed匹配第N个进行替换

    文本:
    aa  sda
    88  sdf
    bb   ppp
    88   cde
    88   cccccdf
    cc  ccccclla
    88   cccas
    88sfweee   faawfw
     
     
    替换一个88为--:
    1. sed '0,/88/s//--/' file

    2. sed ':a;N;$!ba;s/88/--/' file

    [解析]
    这有两种方法,第一个是只匹配到第一个88为止,然后替换那个88为--。
    第二个句子是通过循环把文本全部读进pattern space 然后只替换第一个。
     
     
    替换第N[3]个88为--:
    1. #替换第三个

    2. sed '/88/{x;s/^/./;/^.{3}$/{x;s/.*/--/;x};x;}' file

    3. sed ':a;N;$!ba;s/88/--/3' file   粗体字都是固定格式sed ':a;N;$!ba;s/88这里是要找的内容/--这里是要替换的内容/3' file 

    [解析]
    第一个命令叫打点记数法,因为sed没有 var++ 之类的操作来记数。
    第二个命令和上面第一个其实是一样的原理,全部读入文本后统一替换第3个匹配的内容。
     
     
    替换最后一个匹配的88为--:
    1. sed ':a;/ 88/!{$s/88/--/;N;ba};P;D' file

    2. sed ':a;N;$!ba;s/(.*)88/1--/' file

    [解析]
    第一个命令,没匹配到 / 88/ 的内容就读取下一行,然后 ba 跳转去开始处,如果读取到88的行呢,就执行后面的 P;D 组合,D也有循环功能,一直把匹配 88 内容的第一行打印,删除,直到不匹配/ 88/(因为换行符已经被打印出去了,所以不再会匹配到 88),这时候才继续往下读,如果又读到88的行,那么又执行P;D循环,同上操作。一直到匹配到最后一个88的行,继续读取到末行时执行替换,N 因为没有下一行可读,所以会自动中止命令,因为没有 -n 参数会打印 pattern space 里的内容到屏幕,所以就不会再执行后面的 ba 避免了死循环,这样的用法只存在于 GNU sed ,大家注意。所以这整个流程只会替换最后一个88。
    第二个命令其实和上面的都一样,也是全部读进 pattern space 里,最后利用正则的贪婪替换掉最后一个88。
     
     
    [root@mysql-slave ~]#  cat re

    cc1 abcc abc abbc aabc abbccdd abbcif abbcccccdefa abcccclow abccccdlll
    22 /you 192.168.1.0/24 (wo you huidao ) fa yyy=fang
    33
    44
    55 99988888((((())))))*/^%$sii
    66 99988888((((())))))*/^%$sd
    77 99988888aa
    22 99988888((((())))))
    33 99988888((((()))))){
    33 99988888((((())))))+-!
    44 99988888((((())))))+-!?.,
    come true((()

    [root@mysql-slave ~]#    sed -i ':a;N;$!ba;s#/#99988888((((())))))*&^%$#3' re

    [root@mysql-slave ~]#    sed ':a;N;$!ba;s#99988888((((())))))*/^%$sii#ii#' re

    [root@mysql-slave ~]#    sed  ':a;N;$!ba;s#99988888((((())))))*/^\%$sii#ii#' re

    [root@mysql-slave ~]#    sed ':a;N;$!ba;s#99988888((((())))))+-!#hello#' re

    [root@mysql-slave ~]# sed ':a;N;$!ba;s#99988888((((()))))){#1111111111111#' re

    [root@mysql-slave ~]# sed ':a;N;$!ba;s#99988888((((())))))+-!?.,#ooooooooo#' re

    [root@mysql-slave ~]# sed '2,5s/^/cc1/g' re

    # 注意这里的 " & " 符号,如果没有 “&”,就会直接将匹配到的字符串替换掉
    sed 's/^/添加的头部&/g'      #在所有行首添加
    sed 's/$/&添加的尾部/g'      #在所有行末添加
    sed '2s/原字符串/替换字符串/g'  #替换第2行
    sed '$s/原字符串/替换字符串/g'   #替换最后一行
    sed '2,5s/原字符串/替换字符串/g' #替换2到5行
    sed '2,$s/原字符串/替换字符串/g' #替换2到最后一行
    [root@mysql-slave ~]# sed '5 q' passwd 
    1. sed'5 q'/etc/passwd#打印前5行  
    2. sed-n '/r*t/p'/etc/passwd#打印匹配r有0个或者多个,后接一个t字符的行  
    3. sed-n '/.r.*/p'/etc/passwd#打印匹配有r的行并且r后面跟任意字符  
    4. sed-n '/o*/p'/etc/passwd#打印o字符重复任意次  
    5. sed-n '/o{1,}/p'/etc/passwd#打印o字重复出现一次以上  
    6. sed-n '/o{1,3}/p'/etc/passwd#打印o字重复出现一次到三次之间以上  
  • 相关阅读:
    T2487 公交司机(搜索题)(小L的一生)
    T2485 汉诺塔升级版(普及)(递归)
    T2483 电梯(模拟题)
    将图片返回到前端
    session
    TCP协议
    socket
    断点调试
    解析字符串
    Cookie
  • 原文地址:https://www.cnblogs.com/fyy-hhzzj/p/8659902.html
Copyright © 2011-2022 走看看