zoukankan      html  css  js  c++  java
  • sed实践

    后来也找到一篇文章讲的很详细: http://www.cnblogs.com/ctaixw/p/5860221.html

    ---------------------------------------

    sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换、删除、新增、选取等特定工作,下面先了解一下sed的用法
    sed命令行格式为:
             sed [-nefri] ‘command’ 输入文本        

    常用选项:
            -n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
            -e∶直接在指令列模式上进行 sed 的动作编辑;
            -f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
            -r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
            -i∶直接修改读取的档案内容,而不是由萤幕输出。       

    常用命令:
            a   ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
            c   ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
            d   ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
             i   ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
             p  ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
             s  ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正则表示法!例如 1,20s/old/new/g 就是啦!

    举例:(假设我们有一文件名为ab)


         删除某行

         [root@localhost ruby] # sed '1d' ab              #删除第一行 
         [root@localhost ruby] # sed '$d' ab              #删除最后一行
         [root@localhost ruby] # sed '1,2d' ab           #删除第一行到第二行
         [root@localhost ruby] # sed '2,$d' ab           #删除第二行到最后一行

      显示某行

    .    [root@localhost ruby] # sed -n '1p' ab           #显示第一行 
         [root@localhost ruby] # sed -n '$p' ab           #显示最后一行
         [root@localhost ruby] # sed -n '1,2p' ab        #显示第一行到第二行
         [root@localhost ruby] # sed -n '2,$p' ab        #显示第二行到最后一行

      使用模式进行查询

         [root@localhost ruby] # sed -n '/ruby/p' ab    #查询包括关键字ruby所在所有行
         [root@localhost ruby] # sed -n '/$/p' ab        #查询包括关键字$所在所有行,使用反斜线屏蔽特殊含义

      增加一行或多行字符串

         [root@localhost ruby]# cat ab
         Hello!
         ruby is me,welcome to my blog.
         end
         [root@localhost ruby] # sed '1a drink tea' ab  #第一行后增加字符串"drink tea"
         Hello!
         drink tea
         ruby is me,welcome to my blog. 
         end
         [root@localhost ruby] # sed '1,3a drink tea' ab #第一行到第三行后增加字符串"drink tea"
         Hello!
         drink tea
         ruby is me,welcome to my blog.
         drink tea
         end
         drink tea
         [root@localhost ruby] # sed '1a drink tea
    or coffee' ab   #第一行后增加多行,使用换行符
    
         Hello!
         drink tea
         or coffee
         ruby is me,welcome to my blog.
         end

      代替一行或多行

         [root@localhost ruby] # sed '1c Hi' ab                #第一行代替为Hi
         Hi
         ruby is me,welcome to my blog.
         end
         [root@localhost ruby] # sed '1,2c Hi' ab             #第一行到第二行代替为Hi
         Hi
         end

      替换一行中的某部分

      格式:sed 's/要替换的字符串/新的字符串/g'   (要替换的字符串可以用正则表达式)
         [root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby/bird/g'    #替换ruby为bird
       [root@localhost ruby] # sed -n '/ruby/p' ab | sed 's/ruby//g'        #删除ruby
    
         插入
         [root@localhost ruby] # sed -i '$a bye' ab         #在文件ab中最后一行直接输入"bye"
         [root@localhost ruby]# cat ab
         Hello!
         ruby is me,welcome to my blog.
         end
         bye

         删除匹配行

          sed -i '/匹配字符串/d'  filename  (注:若匹配字符串是变量,则需要“”,而不是‘’。记得好像是)
    
          替换匹配行中的某个字符串
    
          sed -i '/匹配字符串/s/替换源字符串/替换目标字符串/g' filename

    自己练习:

    dahu@dahu-OptiPlex-3046:~/myfile$ cat hehe.txt 
    hehe
    lele
    haha
    lele
    lele
    dahu@dahu-OptiPlex-3046:~/myfile$ sed -n '/.*el.*/p' hehe.txt 
    lele
    lele
    lele
    dahu@dahu-OptiPlex-3046:~/myfile$ sed -i 's/.*el.*//g' hehe.txt 
    dahu@dahu-OptiPlex-3046:~/myfile$ cat hehe.txt 
    hehe
    
    haha

     删除文件中的空格

    sed -i 's/s//g' wrong_in30_notwrongin28.norm

     多命令输入:,知识点:-e可以连接多条命令,-i是对源文件进行操作,不加只是会输出到终端,最后再用awk输出一下格式.

    xch27@taiyuan:/asrdata/users/xch27/lmwork/comm_cloud/aicar_solution/v31_9jun2017.navi/decode0.2/adderr$ head all.add.err.sentence 
    Aligned transcription: csnt-130304-0014-130304-lzyuam-0057-GSHAW1_0000000_0000000_M.lab vs csnt-130304-0014-130304-lzyuam-0057-GSHAW1_0000000_0000000_M.rec
     LAB: 发 短 信 给 陶 斌 
     REC: 发 短 信 给 洮 滨 
    Aligned transcription: csnt-130304-0004-130304-yrongf-0078-GSNOTE_0000000_0000000_F.lab vs csnt-130304-0004-130304-yrongf-0078-GSNOTE_0000000_0000000_F.rec
     LAB: 发 信 息 给 亲 
     REC: 发 信 息 给 钦 
    Aligned transcription: 4c3bf7f4c95b40b0b541e9a60ada11fd.lab vs 4c3bf7f4c95b40b0b541e9a60ada11fd.rec
     LAB: 关 注 了 就 别 塞 
     REC: 关 注 的 久 别 赛 
    Aligned transcription: 9abc86bad9e14d9d9fd6cb1f5f0ce301.lab vs 9abc86bad9e14d9d9fd6cb1f5f0ce301.rec
    
    xch27@taiyuan:/asrdata/users/xch27/lmwork/comm_cloud/aicar_solution/v31_9jun2017.navi/decode0.2/adderr$ sed -e '/Aligned/d' -e 's/s//g' all.add.err.sentence |awk -F":" '{print $2}' | head
    发短信给陶斌
    发短信给洮滨
    发信息给亲
    发信息给钦
    关注了就别塞
    关注的久别赛
    九龙仓集团的股价是多少
    九龙仓集团的股票是多少
    靠郎溪
    靠琅西

    多重命令

    sed -f 文件 

    dahu@dahu-OptiPlex-3046:~/myfile$ cat tmp
    hehe wo
    wojintian
    dahu@dahu-OptiPlex-3046:~/myfile$ cat sedscript 
    s/wo/ta/g;
    s/he/she/g;
    dahu@dahu-OptiPlex-3046:~/myfile$ sed -f sedscript tmp 
    sheshe ta
    tajintian

     sed 获取匹配到的内容 ,需要 加 -r  ,下面这个例子简洁,直观.-r表示扩展,还是很方便的.

    dahu@dahu-OptiPlex-3046:~/myfile$ echo "wo he ni"|sed -r 's/(wo)(.*)(ni)/321/g'
    ni he wo

    在shell 传参给sed 时,会失效,原因是单引号” ,它会阻止转义 。

    方法1: 把单引号改为 双引号 “” ,就OK 了。

    举个栗子:

    #Test1 :correct sample
    sed -n "/${sessionID}-START/,/${sessionID}-END/p" t.t

    方法2: 变量${} 外的字符串全都用单引号”圈住

    $sed -n '/'${sessionID}'-START/,/'${sessionID}'-END/p' t.t

    sed的其他分隔符!这个很关键

    有的时候我们会遇到这样的错误:

    $ sed 's/ni/'${a}/hehe$v'/g' tmp 
    sed: -e expression #1, char 9: unknown option to `s'

    这是是因为使用斜杠(/)作为sed's's'命令的分隔符,并且在sed中看到的分隔符中有一个斜线。 尝试使用不同的分隔符'|'

    例子:

    $ sed 's|ni|'${a}/hehe$v'|g' tmp 
    hehe,sb/hehesdzaina
    wo ai sb/hehesd
  • 相关阅读:
    Populating Next Right Pointers in Each Node II
    Populating Next Right Pointers in Each Node
    Construct Binary Tree from Preorder and Inorder Traversal
    Construct Binary Tree from Inorder and Postorder Traversal
    Path Sum
    Symmetric Tree
    Solve Tree Problems Recursively
    632. Smallest Range(priority_queue)
    609. Find Duplicate File in System
    poj3159最短路spfa+邻接表
  • 原文地址:https://www.cnblogs.com/dahu-daqing/p/6903787.html
Copyright © 2011-2022 走看看