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 \n ---------------------' /root/passwd    #以root开头的行,root行前行加入一行Hello root 一行----------------------

  sed ’/^root /c Hello root\n---------------------‘ /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       #删除行首数字

posted @ 2017-07-01 14:37  DragonSKY  阅读(240)  评论(0编辑  收藏  举报