zoukankan      html  css  js  c++  java
  • sed

    sed

      sed是一种新型的,非交互式的编辑器,他能执行与编辑器vi和ex相同的编辑任务。sed编辑器没有提供交互式使用方式,使用者只能在命令行输入编辑命令、指定文件名,然后在屏幕上查看输出。可以使用shell重定向来保存输出结果,默认情况下,所有输出行都被打印到屏幕上。

      sed编辑器逐行处理文件(或输入),并将输出结果发送到屏幕。sed的命令就是在vi和ed/ex编辑器中见到的那些。sed把当前正在处理的行保存在一个临时缓存区中,这个缓存区称为模式空间或临时缓冲,sed处理完模式空间中的行后(即在改行上执行sed命令后),就把改行发送到屏幕上(除非之前有命令删除这一行或取消打印操作)。sed每行处理完输入文件的最后一行后,sed便结束运行。sed把每一行都存在临时缓存区中,对这个副本进行编辑,所以不会修改或破坏源文件。

            文本文件(this is a line)----------------->缓存模式(this is a line)------------------------->sed的输出(屏幕输出)(this is a line)

    1.命令格式

      sed [ option ] 'command' 输入文本

    说明:

      sed命令在没有给定的位置时,默认会处理所有行。

      sed支持以下几种地址类型:

      1.first~setep

      first指起始匹配行,step指步长,例如sed -n 2~5p,从第二行匹配,隔5行匹配一次,即2,7,12,17...

      2.$

      $表示匹配最后一行。

      3./REGEXP/

      表示匹配正则那一行,通过//之间的正则来匹配。

      4.cREGEXPc

      表示匹配正则那一行,通过c和c之间的正则来匹配,c可以是任意一字符。

      5.addr1,add2

      地址addr1,add2决定用于对哪些行进行编辑,地址的形式可以是数字、正则表达式或二者的结合,如果没有指定地址,sed将处理输入文件中的所有行。

      6.addr,+N

      从addr这行到往下N行匹配,总共匹配N+1行

      sed的正则表达式:

        sed的正则表达式元字符:

        元字符     功能                示例          示例的匹配对象。

        ^        行首定位符              /^love/        匹配所有以love开头的行。

        $       行尾定位符              /love$/        匹配所有以love结尾的行。

        .       匹配除换行外的串个字符        /l..e/         匹配包含字符l、后跟两个任意字符、再跟字母e的行。

        *       匹配零个或多个前导字符        /*love/        匹配在零个或多个空格紧跟着模式love的行。

        []       匹配指定字符组内任意一字符      /[L]ove/        匹配包含love和Love的行。

        [^]       匹配不指定字符组内任意一字符     /[^A-KM-Z]ove/     匹配包含ove,但ove之前的那个字符不在A至K或M至Z间的行。

        &       保存查找串以便在替换串中引用     s/love/**&**/     符号&代表查找串。字符串love将替换前后各加了两个**的引用,即love变成**love**。

        x{m}     连续m个x               /o{5}/        匹配连续5个字母o。

    2.命令参数:

      -n 使用安静模式,在一般情况所有的STDIN都会输出到屏幕上,加上-n后只打印被sed特殊处理的行

      -e 多重编辑,且命令顺序会影响结果。

      -f 指定一个sed脚本文件到命令行执行

      -r sed使用扩展正则

      -i 直接修改文档读取的内容,不在屏幕上输出

    3.sed操作命令:

      sed操作命令告诉sed如何处理由地址指定的各输入行,如果没有指定地址,sed就会处理输入的所有的行。

      命令          说明

      a           在当前行后添加一行或多行

      c           用新文本修改(替换)当前行中的文本

      d            删除行

      i           在当前行之前插入文本

      h            把模式空间里的内容复制到暂存缓存区

      H            把模式空间里的内容追加到暂存缓存区

      g            取出暂存缓存区里的内容,将其复制到模式空间,覆盖该处原有内容

      G            取出暂存缓存区里的内容,将其复制到模式空间,追加在该处原有内容

      I            列出非打印字符

      p            打印行

      n            读入下一输入行,并从下一条命令而不是第一条命令开始处理

      q            结束或退出sed

      r            从文件读取输入行

       !           对所选行以外的所有行应用命令

      s            用一个字符串替换另一个

      替换标志:

      g            在行内进行全局替换

      p            打印行

      w            将行写入文件

      x            交换暂存缓冲区与模式空间的内容

      y            将字符转换为另一字符(不能对正则表达式使用y命令)

    4.实例操作

      实例1:sed '/root/p' /etc/passwd

          sed -n '/root/p' /etc/passwd

      说明:

      默认情况下,sed把所有输入行都打印在变准输出上,如果在某一行匹配到root,sed就把该行另外打印一遍。当选项-n和命令p同时出现时,sed只打印选定内容的行。

      实例2:

      sed ‘3d’ /root/passwd

      sed '3,$d' /root/passwd

      sed '/root/d' /root/passwd

      说明:

      第2行被删除,第3行到最后一行被删除,包含root的行被删除,其余行被打印。

      实例3:

      sed ‘s/root/test/g’ /root/passwd      #全局替换将root替换成test,替换后的行和其他行均被打印

      sed -n 's/root/test/p' /root/passwd       #只打印替换后的行,只替换每行中首个root

      sed 's/[0-9][0-9]$/&.5/' /root/passwd      #将末尾两位数的行加上.5

      sed -n 's/root/test/gp' /root/passwd      #只打印替换后的行

      sed 's/(root)/1test/p' /root/passwd     #在圆括号里的模式root作为标签1保存在特定的寄存器中,替换的串可以通过1来引用它,则root将替换为roottest

      sed 's#root#test#g' /root/passwd        #使用#符号代替/符号作为分隔符

      实例4:

      sed -n '/root/,/dbus/' /etc/passwd       #打印root和dbus之间的所有行,如果root在dbus之后的行出现则打印从root到下一个dbus之间的行

      sed -n ’5,/dbus/‘ /etc/passwd         #打印第五行到dbus之间的所有行

      sed '/root/,/dbus/s/$/**cool**/' /etc/passwd    #将root到dbus之间的行尾加上**cool**

      实例5:

      sed -e ’1,3d‘ -e's/root/test/' /root/passwd   #多重编辑功能

      实例6:

      sed ’/^root /a Hello root‘ /root/passwd                 #以root开头的行,root行后需要加空格

      sed '/^root /i Hello root ---------------------' /root/passwd    #以root开头的行,root行前行加入一行Hello root 一行----------------------

      sed ’/^root /c Hello root ---------------------‘ /root/passwd    #修改缓存区中以root开头的行

      sed '/Hello / {n;s/world/Rootor/;}‘ /root/passwd             #将以命令未执行成功

      sed '/Hello /y/0/1/' passwd                        #将带有Hello行中的0换成1

    5.生产环境案例:

      sed 's/^ *//g' /root/passwd          #文件以空格开头的行,将空格去掉

      sed 's/^[0-9][0-9]//g' /root/passwd       #删除行首数字

  • 相关阅读:
    Calling a parent window function from an iframe
    JSON with Java
    Posting array of JSON objects to MVC3 action method via jQuery ajax
    What's the difference between jquery.js and jquery.min.js?
    jquery loop on Json data using $.each
    jquery ui tabs详解(中文)
    DataTables warning requested unknown parameter
    Datatables 1.10.x在命名上与1.9.x
    jQuery 1.x and 2.x , which is better?
    DataTabless Add rows
  • 原文地址:https://www.cnblogs.com/skydragon/p/7102333.html
Copyright © 2011-2022 走看看