Linux文本处理三剑客之sed流编辑器

一,sed是什么?

  sed是Strem Editor(流编辑器)缩写,是操作、过滤和转换文本内容的强大工具。对文件内容逐行(行编辑器,一行读取一次,对行编辑)进行处理调用操作并显示到STDOUT,常用功能有增删改查,过滤,取行。


二,sed的工作流程

  (1)sed默认不编辑原文件,而是逐行操作处理,把当前处理的行存储在临时缓存空间,称为“模式空间”(pattern space)。

  (2)接着在pattern space内进行模式匹配,即和指定条件做匹配

      不满足模式:输出到标准输出STDOUT;

      满足模式:进行指定的模式操作,再输出到STDOUT;

  (3)第二个特殊的缓存空间――“保持空间”:hold space,临时保存操作在另一处缓存空间;

  (4)当执行pattern space和 hold space里相关选项的时候来回进行之间的数据流编辑操作;

  (5)最后根据操作执行hold space空间操作,选择性显示到STDOUT;  

三,sed的语法格式

   sed [OPTION]...  'script'  [input-file] ...

   注意:1.sed和后面的选项之间至少有一个空格

      2.script:指的是AddressCommands(地址定界编辑命令),AddressCommands中间无空格,直接连接为一个选项操作

      3.input-file(输入文件)是可选项,sed还能够从标准输入如管道获取输入。


四,sed的常用选项和地址定界

   (1)OPTION常用选项:

-n:不输出模式空间中的内容至屏幕;
-e script, --expression=script:多点编辑;
-f  /PATH/TO/SED_SCRIPT_FILE:每行一个编辑命令;
-r, --regexp-extended:支持使用扩展正则表达式;
-i[SUFFIX], --in-place[=SUFFIX]:直接编辑原文件 ;(编辑操作的结果直接保存在原文件中)

   (2)地址定界:

   ①空地址:什么都不写时,表示对全文进行处理;
   ②单地址:
       #:指定行;
       /pattern/:被此模式所匹配到的每一行;注意:【/ /】是固定模式符号,不能省略

   ③地址范围:(#表示任意数字)
       #,#:从某行到某行,第二个#大于第一个#

       #,+#:从某行开始到加多少行(3,+8 :第3行向下开始一共8行,包含第三行)
       #,/pattern1/:(从指定的行开始到第一次被模式所匹配的行结束的所有行)
       /pattern1/,/pattern2/:从第一次匹配到的模式1到第二次匹配到的模式2
       $:最后一行;
   ④步进:~,#~#   从第几行

       1~2:所有奇数行。    从第一行开始,每次加两行读取

       2~2:所有偶数行。    从第二行开始,每次加两行读取


五,sed编辑命令

  (1)常用编辑命令:

  d:删除

~]# sed '1d' FILE                 #删除第一行
~]# sed  '2,$d' FILE              #删除第二行到最后一行

  p:列印;显示模式空间中的内容,但默认会输出2次匹配的结果,因此使用-n取消默认输出;

~]# sed -n '1p' FILE             #显示第一行
~]# sed -n '2,$p' FILE              #显示第二行到最后一行

  a \text:新增;在行后面追加文本“text”,支持使用\n实现多行追加; 

~]# sed   '/^test/a\this is' FILE        #将 this is 追加到以test开头的行后面
~]# sed   '2a\this is\nis this' FILE     #将 this is 和 is this 多行追加第二行后面

  i  \text:插入;在行前面插入文本“text”,支持使用\n实现多行插入;

~]# sed -i '5i\this is' FILE        #在文件第5行之前插入this is 
~]# sed -i '5i\this is\nis this' FILE  #将 this is 和 is this 多行插入第5行之前

  c \text:按行替换;把匹配到的行替换为此处指定的文本“text”;

~]# sed  '2c\this is' FILE            #将文件第二行替换为this is

  w /PATH/TO/SOMEFILE:保存模式空间匹配到的行至指定的文件中;

~]# sed -n '/test/w file' example     #在example中所有包含test的行都被写入file里

  r  /PATH/FROM/SOMEFILE:读取指定文件的内容至当前文件被模式匹配到的行后面;文件合并;

~]# sed   '2r  file'   filename   #将file的内容读进来显示在filename文件第二行后面

  =:为模式匹配到的行打印行号;

~]# sed   '/this is/='   FILE       #显示 this is 的行号

  !:条件取反;

   地址定界!编辑命令;

~]# sed '1!d' FILE         #除了第一行全部删除

  s///:查找替换,其分隔符可自行指定,常用的有s@@@, s###等;

~]# sed 's/book/books/' FILE        #把每一行中第一处 book 替换成 books

   替换标记:

     g:全局替换;

~]# sed 's/book/books/g' FILE        #把每一行中的所有 book 替换成 books
~]# sed 's/book/books/3g' FILE       #从每一行的第三处开始替换

     w /PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中;
     p:显示替换成功的行;

~]# sed 's/book/books/3gp' FILE       #显示替换成功的行


  练习:

  1.删除text9文件中所有以空白字符开头的行的行首的所有空白字符;

~]# sed 's@^[[:space:]]\+@@' text9

  


  2.删除text9文件中所有以#开头的行的行首的#号及#后面的所有空白字符;

~]# sed  's@^#[[:space:]]*@@' text9

  


  3.输出一个绝对路径给sed命令,取出其目录,其行为类似于dirname;

~]# echo "/var/log/messages/" | sed 's@[^/]\+/\?$@@'
~]# echo "/var/log/messages" | sed -r 's@[^/]+/?$@@'

   wKiom1budyuxohFZAAAOIHdaPH4043.png

  (2)高级编辑命令:

   h:把模式空间中的内容覆盖至保持空间中;
   H:把模式空间中的内容追加至保持空间中;
   g:把保持空间中的内容覆盖至模式空间中;
   G:把保持空间中的内容追加至模式空间中;

   P:打印多行匹配空间的第一行。

   x:把模式空间中的内容与保持空间中的内容互换;
   n:覆盖读取匹配到的行的下一行至模式空间中;
   N:追加读取匹配到的行的下一行至模式空间中;
   d:删除模式空间中的行;
   D:删除多行模式空间中的所有行;


  实例:

   sed  -n  'n;p'  FILE:显示偶数行;
   sed  '1!G;h;$!d'  FILE:逆序显示文件的内容;
   sed  ’$!d'  FILE:取出最后一行;
   sed  '$!N;$!D' FILE:取出文件后两行;
   sed '/^$/d;G' FILE:删除原有的所有空白行,而后为所有的非空白行后添加一个空白行;
   sed  'n;d'  FILE:显示奇数行;
   sed 'G' FILE:在原有的每行后方添加一个空白行


六,实战案例

   1.变量替换

   Linux文本处理三剑客之sed流编辑器_第1张图片


   2.分组替换\( \)和\1的用法:

   \( \)的功能可以记住正则表达式的一部分,其中,\1为第一个记住的模式即第一个小括号中的匹配内容,\2第二记住的模式,即第二个小括号中的匹配内容,sed最多可以记住9个。

   Linux文本处理三剑客之sed流编辑器_第2张图片


   3.特殊符号 & 代表被替换的内容

   将text9中 b 改成 --b--

   Linux文本处理三剑客之sed流编辑器_第3张图片


   4.打印奇偶行

   打印奇数行:

   Linux文本处理三剑客之sed流编辑器_第4张图片

   打印偶数行:

   Linux文本处理三剑客之sed流编辑器_第5张图片


   5.获取本机IP地址

   wKiom1bveWOR3hB8AAAKj6qemfk750.png


你可能感兴趣的:(sed,流编辑器,sed的用法,linux文本三剑客)