• sed的用法


    1、什么是sed

    sed命令是一个流线式、非交互式编辑器,可以实现在vi等编辑器中一样的编辑效果。
     

    2、sed的工作原理

    模式空间(pattern space)
    sed一次处理一行文本(或输入),并把输出送往屏幕或重定向到文件。
    sed把当前处理的行存储在临时缓冲区中,称为模式空间。
    一旦完成对模式空间中的行的处理,也就是执行完这一行中的sed命令,模式空间中的行就被送往屏幕(除非是删除行命令或者打印到打印机)。
    行被处理完后,就被移出模式空间,程序接着读入下一行,处理、显示、移出......直到文件的最后一行处理完以后sed结束。
     
    保持缓冲区(holding buffer)
    h命令将模式空间中的行复制到一个叫保持缓冲区的特殊缓冲区中。
    G命令将保持缓冲区中的行放回模式空间中,且追加到模式空间中已有行的末尾。
    g命令将保持缓冲区中的行放回模式空间中,且替换模式空间中已有的行。
    x命令互换模式空间和保持缓冲区的内容。
     
    注意:保持缓冲区一次只能容纳一行。

    3、定址

    通过定址来判断哪一行希望被编辑。
    可以通过数字、正则表达式或者二者结合的方式来定址。
    在没有定址的情况下,sed处理输入文件的所有行。
    $sed '1,3d' myfile
    $sed -n '/John/p'

    4、命令和选项

    命令:
    a在当前行后面加入一行或者文本
    i在当前行前面插入一行
    d从模式空间中删除匹配的行
    p打印匹配模板的行
    r file从file中读行
    h拷贝模板块的内容到内存中的缓冲区
    G命令将保持缓冲区中的行放回模式空间中,且追加到模式空间中已有行的末尾
    g命令将保持缓冲区中的行放回模式空间中,且替换模式空间中已有的行
    q退出sed
    !表示后面的命令对所有没有被选定的行发生作用
    s/re/string用string替换正则表达式re匹配的字符串
     
    替换标记:
    g行内全面替换
    w写入文件
     
    选项:
    -e command允许多点编辑
    --expression command允许多点编辑
    -n取消默认输出
     

    5、sed支持的特殊元字符

    &保存搜索字符用来替换其他字符s/love/&/将love替换为love

    6、sed脚本

    就是一个包含sed命令清单的文件,好处是不必担心与shell命令行的交互问题,不需要引用sed命令来防止它被shell解释。
    sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或者文本。
    $sed -f script.sh datafile

    7、实例

    1)p命令
    $sed -n '/north/p' datafile//-n和p命令一般一块使用,用来只打印匹配模板的行,取消默认打印模式空间中的所有行的行为
     
    2)删除:d命令
    $sed '3d' datafile//删除第3行
    $sed '3,$' datafile//删除第3到最后一行
     
    3)替换:s命令
    $sed 's/west/north/g' datafile //如果没有g标志,则只替换第1个匹配的
    $sed -n 's/west/north/gp' datafile //-n和p命令只打印发生替换的行
    $sed 's/[0-9][0-9]$/&.5/' datafile//&表示替换字符串中被找到的部分
    $sed -n 's/(Mar)got/1ianne/p' datafile//标记
    $sed 's#west#east#g'//s后面的字符是分隔搜索字符串和替换字符串的字符,默认是/,但在s命令情况下可以改变,无论什么字符紧跟着s命令被认为是新的分隔符。
     
    4)选定行的范围:,
    $sed -n '/west/,/east/p' datafile//打印west和east之间的行。如果west未找到,则不打印任何行;如果east未找到,则打印west到末尾的所有行。
    $sed '/west/,/east/s/$/VAR*/' datafile
     
    5)多点编辑:e命令
    $sed -e '1,3d' -e 's/Hemenway/Jones/' datafile//多个命令是在同一行执行,命令的执行顺序影响命令的结果。
    $sed --expression='s/TB/Tobias/' --expression='/north/d' datafile
     
    6)从文件读入:r命令
    $sed '/Suan/r newfile' datafile//从文件读入的内容显示在所有匹配行的后面
     
    7)写入文件:w命令
    $sed -n ''/north/w newfile' datafile//将模板匹配的行写入文件
     
    8)追加命令:a命令
    $sed -n '/^north/a
    ----->The North Sales Distribute Has Moved<------------' datafile
     
    $sed -n '/^north/a
    ----->The North Sales Distribute Has Moved<------------
    ----->The North Sales Distribute Has Moved<------------' datafile//追加多行,除了最后一行,每一行需要加
     
    9)插入:i命令
    $sed -n '/^north/i
    ----->The North Sales Distribute Has Moved<------------' datafile
     
    $sed -n '/^north/i
    ----->The North Sales Distribute Has Moved<------------
    ----->The North Sales Distribute Has Moved<------------' datafile//在匹配行之前插入多行,除了最后一行,每一行需要加
     
    10)下一个:n命令
    $sed '/eastern /{n; s/AM/Archie/; }' datafile
     
    11)变形:y命令
    $sed '1,3y/abcdefg/ABCDEFG/' datafile//将a-g变换为大写,定址部分可使用正则表达式
     
    12)退出:q命令
    $sed '5q' datafile//打印第5行之后退出
    $sed '/Lewis/{ s/Lewis/Jooseph/;q }//{ }执行多个命令,分号分隔,可嵌套
     
    13)保持和获取:h命令、G命令、g命令
    $sed -e '/northeast/h' -e '$G' datafile//将含northeast的行追加到文件的最后一行
    $sed -e '/WE/{h, d; }' -e '/CT/{G;}' datafile//将包含WE的行移动到包含CT的行的后面
    $sed -e '/northeast/h' -e '$g' datafile//将含northeast的行替换文件的最后一行
     
    14)保持和互换
    $sed -e '/particia/h' -e '/Margot/x' datafile//包含Margot的行被包含particia的行替换了
     
    15)其它实例
    查找包含字符串的行
    #sed -n '/^vmm_read_interval/p' log2.txt >avg2.txt                  //-n和/p命令一般配合使用,只打印找到的行
     
    删除文件中的空行
    #sed '/^$/d' file
     
    针对已查找到的内容进行替换
    #sed 's/^[1-9]/ &/g' 2.srt>3.srt    //在以数字开头的行前加一个空行
    #sed 's/[0-9][0-9]$/&.5/' datafile     //以两位数结尾行加.5
    #sed 's/address/&#/g' /etc/network/interfaces       //在所有address后加#
    #sed 's/:.*[0-9]$g'          将冒号以及冒号后的数字替换成空
    注意:
    1)&符号替换字符串中被找到的部分,不是指找到部分所在的整行
    2)/g表示命令作用的范围为整行,即对一行中所有找到的内容执行相应动作,否则只针对第一次找到的内容
     
    多点编辑
    #sed -e 's/address/#&/' -e 's/netmask/#&/' -e 's/gateway/#&/g' -e 's/^##//g' $NET_CONFIG_FILE.bak >$NET_CONFIG_FILE 
    //首先在所有address,netmask,gateway单词前加一个#,再针对以两个#开头的行中将两个#去掉,从前往后依次执行。
     
    合并两行
    1) 先将每一行的开头用一特殊的字符串标记,例如BBBB
    2) 将需要合并的行的前一行末尾用一特殊的字符串标记,例如AAAA
    3) 用tr删除所有回车换行符 ,则所有行合成一行。真正需要合并的行之间会存在AAAABBBB的标记,需要换行的地方有BBBB的标记
    4) 将所有AAAABBBB替换成空
    5) 将所有BBBB替换成‘   ’
    具体程序如下:
    sed '1,$s/^/BBBB/g' $1.1 >$1.2
    sed '/[^。)?”!〗]$/s/$/AAAA/' $1.2 >$1.3
    sed -n '1,$p' $1.3|tr -d ' '>$1.4
    sed 's/AAAABBBB//g' $1.4>$1.5
    sed 's/BBBB/    /g' $1.5>$1.6
    sed 's/AAAA//g' $1.6>$1.7
    cp $1.7 $1.txt
    echo "finished."
    rm $1.[0-9]*
     
    将中英文字幕文件分成中文和英文两个字幕文件
    $sed '/^[0-9][0-9]:/{n;d}' 1.srt >2.srt
    $sed '/^[0-9][0-9]:/{n;n;d}' 1.srt >3.srt
     

    =-=-=-=-=
    Powered by Blogilo

  • 相关阅读:
    Redis学习——数据结构下
    CI 笔记7,easyui 异步加载
    CI 笔记,借鉴的4个辅助自定义函数
    CI笔记6 json 传值
    CI 笔记,使用 json的参考文档(废弃)
    CI 笔记5 (CI3.0 默认控制器,多目录)
    CI 笔记(easyui js命令)
    CI 笔记4 (easyui 手风琴)
    CI 笔记3 (easyui 的layout布局,最小化layout原型)
    CI 笔记3 (easyui 和 js 排错)
  • 原文地址:https://www.cnblogs.com/pandachen/p/4165809.html
Copyright © 2020-2023  润新知