• shell学习(2)- sed


    一、替换(s)

    详细用法  [address]s/pattern/replacement/flags
    修饰flag的标志如下:
    命令 说明
    n 1到512之间的一个数字,表示文本模式中指定模式第n次出现的情况进行替换
    g 对模式空间的所有出现的情况进行全局更改,没有g通常只有第一次出现的情况被取代
    p 打印模式空间的内容
    w file 将模式空间的内容写到文件file中
    x 表示互换模板块中的文本和缓冲区中的文本
    y 表示把一个字符翻译为另外的字符(但是不用于正则表达式)
    & 已匹配字符串标记
     
     
     准备测试文件:
    [kumufengchun@localhost ~]$ cat replace.txt
    my name is Lily
    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

    替换文本中的字符串

    [kumufengchun@localhost ~]$ sed 's/This/That/' replace.txt
    my name is Lily
    That is your dog
    my dog's name is frank
    That is your fish
    my fish's name is george
    That is your goat
    my goat's name is adam

    上述命令只是替换每行的第一个,如果替换所有的需要 用  sed 's/This/That/g' replace.txt

    打印替换行

    [kumufengchun@localhost ~]$ sed 's/This/That/p' replace.txt
    my name is Lily
    That is your dog
    That is your dog
    my dog's name is frank
    That is your fish
    That is your fish
    my fish's name is george
    That is your goat
    That is your goat
    my goat's name is adam
     
    -n选项和p命令一起使用表示只打印那些发生替换的行
    [kumufengchun@localhost ~]$ sed -n 's/This/That/p' replace.txt
    That is your dog
    That is your fish
    That is your goat

    直接编辑文件选项-i,会匹配文件中每一行的第一个This替换为That,即在原文件中修改

    [kumufengchun@localhost ~]$ sed -i 's/This/That/' replace.txt
    [kumufengchun@localhost ~]$ cat replace.txt
    my name is Lily
    That is your dog
    my dog's name is frank
    That is your fish
    my fish's name is george
    That is your goat
    my goat's name is adam
    当需要从第N处匹配开始替换时,可以使用/Ng:
    修改下文件如下:
    [kumufengchun@localhost ~]$ cat replace.txt
    my name is Lily
    that is your that dog
    my dog's name is frank
    that is your that fish
    my fish's name is george
    that is your that goat
    my goat's name is adam
    
    [kumufengchun@localhost ~]$ sed 's/that/this/2g' replace.txt
    my name is Lily
    that is your this dog
    my dog's name is frank
    that is your this fish
    my fish's name is george
    that is your this goat
    my goat's name is adam

    定界符出现在样式内部时,需要进行转义

    [kumufengchun@localhost ~]$ echo '/usr/local/bin' | sed 's//usr/local/bin//USR/LOCAL/BIN/g'
    /USR/LOCAL/BIN

    命令中的三根斜线分隔符可以换成别的符号,有时候替换目录字符串的时候有较多斜线,这个时候换成其它的分割符是较为方便,只需要紧跟s定义即可

    [kumufengchun@localhost ~]$ sed 's?that?this?2g' replace.txt
    my name is Lily
    that is your this dog
    my dog's name is frank
    that is your this fish
    my fish's name is george
    that is your this goat
    my goat's name is adam
    [kumufengchun@localhost ~]$ sed 's|that|this|2g' replace.txt
    my name is Lily
    that is your this dog
    my dog's name is frank
    that is your this fish
    my fish's name is george
    that is your this goat
    my goat's name is adam
    ”^”表示行首
    ”$”符号如果在引号中表示行尾,但是在引号外却表示末行(最后一行)
    # 注意这里的 " & " 符号,如果没有 “&”,就会直接将匹配到的字符串替换掉
    sed 's/^/添加的头部&/g'      #在所有行首添加
    sed 's/$/&添加的尾部/g'      #在所有行末添加
    sed '2s/原字符串/替换字符串/g'  #替换第2行
    sed '$s/原字符串/替换字符串/g'   #替换最后一行
    sed '2,5s/原字符串/替换字符串/g' #替换2到5行
    sed '2,$s/原字符串/替换字符串/g' #替换2到最后一行
    [kumufengchun@localhost ~]$ sed 's/^/添加的头部&/g' replace.txt
    添加的头部my name is Lily
    添加的头部that is your that dog
    添加的头部my dog's name is frank
    添加的头部that is your that fish
    添加的头部my fish's name is george
    添加的头部that is your that goat
    添加的头部my goat's name is adam
    
    [kumufengchun@localhost ~]$ sed 's/$/&添加的尾部/g' replace.txt
    my name is Lily添加的尾部
    that is your that dog添加的尾部
    my dog's name is frank添加的尾部
    that is your that fish添加的尾部
    my fish's name is george添加的尾部
    that is your that goat添加的尾部
    my goat's name is adam添加的尾部
    
    [kumufengchun@localhost ~]$ sed '2s/that/jiao/g' replace.txt
    my name is Lily
    jiao is your jiao dog
    my dog's name is frank
    that is your that fish
    my fish's name is george
    that is your that goat
    my goat's name is adam
    
    [kumufengchun@localhost ~]$ sed '$s/my/your/g' replace.txt
    my name is Lily
    that is your that dog
    my dog's name is frank
    that is your that fish
    my fish's name is george
    that is your that goat
    your goat's name is adam
    
    [kumufengchun@localhost ~]$ sed '2,5s/my/your/g' replace.txt
    my name is Lily
    that is your that dog
    your dog's name is frank
    that is your that fish
    your fish's name is george
    that is your that goat
    my goat's name is adam
    
    [kumufengchun@localhost ~]$ sed '2,$s/my/your/g' replace.txt
    my name is Lily
    that is your that dog
    your dog's name is frank
    that is your that fish
    your fish's name is george
    that is your that goat
    your goat's name is adam

    同时执行两个替换规则,sed 's/^/添加的头部&/g;s/$/&添加的尾部/g'

    [kumufengchun@localhost ~]$ sed 's/^/添加的头部&/g;s/$/&添加的尾部/g' replace.txt
    添加的头部my name is Lily添加的尾部
    添加的头部that is your that dog添加的尾部
    添加的头部my dog's name is frank添加的尾部
    添加的头部that is your that fish添加的尾部
    添加的头部my fish's name is george添加的尾部
    添加的头部that is your that goat添加的尾部
    添加的头部my goat's name is adam添加的尾部

     二、删除(d)

     删除空白行
    [kumufengchun@localhost ~]$ cat sed.txt
    my cat's name is betty
    
    This is your This dog
    my dog's name is This frank
    
    This is your fish
    my fish's name is This george
    This is your goat
    my goat's name is This adam
    
    [kumufengchun@localhost ~]$ sed '/^$/d' sed.txt
    my cat's name is betty
    This is your This dog
    my dog's name is This frank
    This is your fish
    my fish's name is This george
    This is your goat
    my goat's name is This adam

    删除第2行

    [kumufengchun@localhost ~]$ sed '2d' sed.txt
    my cat's name is betty
    This is your This dog
    my dog's name is This frank
    
    This is your fish
    my fish's name is This george
    This is your goat
    my goat's name is This adam

    删除文件的第2行到末尾所有行

    [kumufengchun@localhost ~]$ sed '2,$d' sed.txt
    my cat's name is betty

    删除文件最后一行

    [kumufengchun@localhost ~]$ sed '$d' sed.txt
    my cat's name is betty
    
    This is your This dog
    my dog's name is This frank
    
    This is your fish
    my fish's name is This george
    This is your goat

    删除文件中所有以my开头的行

    [kumufengchun@localhost ~]$ sed '/^my/d' sed.txt
    
    This is your This dog
    
    This is your fish
    This is your goat

    -e选项允许在同一行里执行多条命令

    [kumufengchun@localhost ~]$ sed -e '1,5d' -e 's/my/MY/' sed.txt
    This is your fish
    MY fish's name is This george
    This is your goat
    MY goat's name is This adam

    删除不连续的行   ##注意这里不能添加引号或者双引号,否则报错

    [kumufengchun@localhost ~]$ sed -e{2,4}d sed.txt
    my cat's name is betty
    This is your This dog
    
    This is your fish
    my fish's name is This george
    This is your goat
    my goat's name is This adam

     三、列表(l)

     列表命令(l)可用于显示模式空间的内容,将非打印的字符显示为两个数字的ASCII码。可以使用该命令来检测输入中的不可见字符
    [kumufengchun@localhost ~]$vim list.txt
    19楼浙江家博会^I^A19lou.com^A^A^A$
    19楼 装修^I^A19lou.com^A^A^A$
    杭州19楼家博会^I^A19lou.com^A^A^A$
    杭州19楼家博会下一季时间^I^A19lou.com^A^A^A$
    杭州19楼装修^I^A19lou.com^A^A^A$
    杭州19楼装饰^I^A19lou.com^A^A^A$
    杭州装修19楼^I^A19lou.com^A^A^A$
    [kumufengchun@localhost ~]$sed "l" list.txt
    19楼浙江家博会    19lou.com
    19346245274 350243205344277256 00119lou.com010101$
    19楼 装修    19lou.com
    34623525534526723619346245274345256266345215232344
    274232 00119lou.com010101$
    杭州19楼家博会    19lou.com
    34623525534526723619346245274345256266345215232344
    274232344270213344270200345255243346227266351227264
    00119lou.com010101$
    杭州19楼家博会下一季时间    19lou.com
    34623525534526723619346245274350243205344277256 011
    9lou.com010101$
    杭州19楼装修    19lou.com
    34623525534526723619346245274350243205351245260 011
    9lou.com010101$

    四、追加(a)

    [line-address]a ext file.txt
    追加到以my开头的行后面
    [kumufengchun@localhost ~]$ cat sed.txt
    my cat's name is betty
    
    This is your This dog
    my dog's name is This frank
    
    This is your fish
    my fish's name is This george
    This is your goat
    my goat's name is This adam
    [kumufengchun@localhost ~]$ sed '/^my/awhat is it' sed.txt
    my cat's name is betty
    what is it
    
    This is your This dog
    my dog's name is This frank
    what is it
    
    This is your fish
    my fish's name is This george
    what is it
    This is your goat
    my goat's name is This adam
    what is it

    在sed.txt文件第2行之后插入what is it

    [kumufengchun@localhost ~]$ sed '2awhat is it' sed.txt
    my cat's name is betty
    
    what is it
    This is your This dog
    my dog's name is This frank
    
    This is your fish
    my fish's name is This george
    This is your goat
    my goat's name is This adam

    五、插入(i)

     line-address]i ext file.txt
    [kumufengchun@localhost ~]$ sed '/^my/iwhat is it' sed.txt
    what is it
    my cat's name is betty
    
    This is your This dog
    what is it
    my dog's name is This frank
    
    This is your fish
    what is it
    my fish's name is This george
    This is your goat
    what is it
    my goat's name is This adam

    六、更改(c)

     [line-address]c ext file.txt
    [kumufengchun@localhost ~]$ sed '/^my/cwhat is it' sed.txt
    what is it
    
    This is your This dog
    what is it
    
    This is your fish
    what is it
    This is your goat
    what is it

    七、变形(y)

     
    [kumufengchun@localhost ~]$ sed 'y/my/MY/' sed.txt
    MY cat's naMe is bettY
    
    This is Your This dog
    MY dog's naMe is This frank
    
    This is Your fish
    MY fish's naMe is This george
    This is Your goat
    MY goat's naMe is This adaM

    八、奇数行

     
    [kumufengchun@localhost ~]$ sed -n 'p;n' sed.txt
    my cat's name is betty
    This is your This dog
    
    my fish's name is This george
    my goat's name is This adam

    九、偶数行

     
    [kumufengchun@localhost ~]$ sed -n 'n;p' sed.txt
    
    my dog's name is This frank
    This is your fish
    This is your goat

     十、从文件读入 (r)

     
    file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面
    [kumufengchun@localhost ~]$ cat kumu.txt
    mmmmmmmmmmmmmmmmmmm
    [kumufengchun@localhost ~]$ sed '/my/r kumu.txt' sed.txt
    my cat's name is betty
    mmmmmmmmmmmmmmmmmmm
    
    This is your This dog
    my dog's name is This frank
    mmmmmmmmmmmmmmmmmmm
    
    This is your fish
    my fish's name is This george
    mmmmmmmmmmmmmmmmmmm
    This is your goat
    my goat's name is This adam
    mmmmmmmmmmmmmmmmmmm

    十一、写入文件命令(w)

    [kumufengchun@localhost ~]$ sed '/my/w kumu.txt' sed.txt
    my cat's name is betty
    
    This is your This dog
    my dog's name is This frank
    
    This is your fish
    my fish's name is This george
    This is your goat
    my goat's name is This adam
    [kumufengchun@localhost ~]$ cat kumu.txt
    my cat's name is betty
    my dog's name is This frank
    my fish's name is This george
    my goat's name is This adam

    十二、命令写入文件 (f)

    [kumufengchun@localhost ~]$ cat kumu.txt
    s/betty/kumufengchun/g
    s/adam/jiaojiao/g
    
    [kumufengchun@localhost ~]$ cat sed.txt | sed -f kumu.txt
    my cat's name is kumufengchun
    
    This is your This dog
    my dog's name is This frank
    
    This is your fish
    my fish's name is This george
    This is your goat
    my goat's name is This jiaojiao
     
    -e:执行命令行中的指令,例如:sed -e 'command' file(s)
     
    -f:执行一个sed脚本文件中的指令,例如: sed -f  scriptfile file(s)
     
    -i:与-e的区别在于:当使用-e时,sed执行指令并不会修改原输入文件的内容,只会显示在bash中,而使用-i选项时,sed执行的指令会直接修改原输入文件。
     
    -n:读取下一行到pattern space。
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    【hive】时间段为五分钟的统计
    【git】提交到github不显示贡献小绿点问题的解决
    【hive】关于用户留存率的计算
    【hive】求日期是星期几
    【hive】数据仓库层次设计
    【hive】count() count(if) count(distinct if) sum(if)的区别
    转载:几种 hive join 类型简介
    丑小鸭和白天鹅没有区别
    好好照顾自己,就像照顾你爱的人那样;
    灵光一闪(最近更新于2020/8/23)
  • 原文地址:https://www.cnblogs.com/kumufengchun/p/10063692.html
Copyright © 2020-2023  润新知