文本处理三剑客之sed及vi编辑使用

作用:

      sed是Linux系统文本处理工具中的三剑客之一,它是一种流编辑器,以行为单位,能够使用正则表达式;跟其他文本处理工具模式相同,不对原文件直接操作,而是先借用一个临 时的数据缓冲区存放文文本数据,同时还有一个自己独特的空间"pattern space",我们称之为sed的模式空间,它的处理流程是:

           (1)首先是逐行读取文本,放到模式空间中;

           (2)判断模式空间是否被sed模式匹配到到:

           (3)如果能够被sed模式匹配到要执行sed编辑命令,默认把结果输出到标准输出(stdout);

           (4)如果不能够被sed模式匹配到,默认也把没有匹配到的内容输出到stdout;

           (5)同时如果不执行-d命令删除模式空间中的内容时,默认会把模式空间中的内容输出到stdout

语法格式:

         sed [options]…'script' [input-file]…

            script:是sed模式匹配条件,也叫sed脚本,由地址定界和编辑命令组成; 

                 (1)地址定界:指的是要操作的文本行范围;

                 (2)编辑命令:指的是要对匹配到的文本范围执行什么样编辑命令;

常见选项:[option


         -n :不输出模式空间的内容到stdout;sed默认是要把模式空间中的内容输出到stdut;

         -e 'script' :可以指定多个匹配模式条件,实现多点编辑;

         -f script-file :可以把匹配模式条件写到文件中,直接引用文件读取;

         -r :支持使用扩展正则表达式,模式使用基本正则表达式;

         -i :直接对原文件执行编辑修改,操作非常危险,可以-i.bak,可以同时先备份以原文件跟.bak结尾的文件;

      

地址定界分类:

       

          (1)空地址:

      

             以全文匹配处理;

          (2)单地址:

         

             # :指定行号;

      

             /pattern/ :被模式匹配到的所有行;

          (3)范围地址:

             #,#         :指定以前一个#开头的行到后一个以#结束的行所有行;

               

             #,+#       :指定以第#开始的行在跟#个行,5,+5:表示从第五行开始在跟5行,总共匹配 11 行,包括指定开始的行;

      

            #,/pattern/ :指定从#开头,到第一个被/pattern/匹配到的中间所有行;

     

            /pattern1/,/pattern2/ :从第一个被/pattern1/匹配到的行开始到第一被/pattern2/匹配到的行结束中间的所有行;

          (4)步进地址:

       

             1~2:指定所有奇数行;

             2-2:指定所有偶数行;

          

编辑命令:

       

          d :删除地址定界指定的行

          p :打印模式空间中的行输出到stdout;一般结合选项-n,效果看起来有变化;

          a\string :在匹配到的地址定界行下面添加string内容,内容中使用"\n",可以实现换行;

          i\string :在匹配到的地址定界行上面添加string内容,使用"\n"实现换行;

          c\string :把匹配到的地址定界行替换成新行string内容;

          s///或者s@@@ :在指定的地址定界中搜索指定字符并替换;其中替换标记如下

            

                g:行内全局替换;

                w /path/file :将替换成功的结果保存至指定文件中;

                p:显示替换成功的行;

         r /path/file :读入其他文件的行到指定的地址定界中;

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

        

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

        

         !:条件取反;格式:地址定界!编辑命令;

sed高级使用:sed除了有一个模式空间以外,还有一个空间叫hold space保持空间;通过命令实现模式空间与保持空间中的行来回操作,达到特定编辑功能;

sed高级编辑命令:

        

        h :把模式空间中的内容覆盖到保持空间中;

        

        H :把模式空间中的内容追加到保持空间中;

     

        g :把保持空间中的内容覆盖到模式空间中;

    

        G :把保持空间中的内容追加到模式空间中;

        x :两个空间内容置换;

        n :读取匹配到的行的下一行到模式空间中,匹配到行会被覆盖;

   

        N :读取匹配到的行的下一行追加到模式空间中;匹配到行不会被覆盖;

   

        d :删除模式空间中的行;

      

        D :删除多行模式空间中的所有行;

vi编辑器:

      它是一款强大的文本编辑工具,用在命令行模式下,其中vim是vi的升级版本,功能更加完善,其中的对系统配置定义的语法高亮检查很是实用;熟练掌握使用后,对系统管理维护工作中对文本的操作效率非常高,所有平时要注意多练习,而且vimtutor命令可以引导练习在里面操作;

   

 1.vi模式:

       编辑器也跟其他模式化文本处理工具一样,不是直接对原文件进行修改操作,先把文本数据读取到自己的vi工作空间中;其实vi有三个模式,不同模式实现的功能不同;下面介      绍:

        

        (1)编辑模式:默认打开文件后进入编辑模式,在这里可以实现复制删除替换查找等命令;      

            (2)输入模式:在这里可以直接对文本进行编辑写等操作;

        (3)末行模式:在这里可以使用末行模式命令对文本进去处理操作;

 2.vi模式切换:

        (1)编辑模式–>输入模式

           i:在当前光标所在字符的前面转换为输入模式;

           I:在当前光标所在行的行首转换为输入模式;

           a:在当前光标所在字符的后面转换为输入模式;

           A:在当前光标所在行的行尾转换为输入模式;

           o:在当前光标所在行的下方插入一个新行转换为输入模式;

           O:在当前光标所在行的上方插入一个新行转换为输入模式;

        (2)输入模式–>编辑模式

            ESC按键;

        (3)编辑模式–>末行模式

           输入冒号:

        (4)末行模式–>编辑模式

           ESC按键,快速切换可以按两下ESC按键;

3.打开文件:

        语法格式 

           vim [options] [file ..]

        vi + :打开定位文件最后一行

        vi +[num] :打开文件定位到指定行

        vi +/pattern :打开文件定位到第一次被模式匹配到的行;

       

        file:注意如果实现没有这个文件,就创建这个文件为新文件,不能跟目录同名;

4.关闭文件:

        (1)末行模式关闭文件

           :q 退出

           :q! 强制退出不保存;

           :w 保存;

           :w! 强制保存;

           :wq 保存并退出;

           😡 保存并退出;

        (2)编辑模式下退出

           ZZ 保存并退出;

5.在编辑模式中移动光标:

        (1)逐字符移动:

           h <– 向左

           l –> 向右

           j  v  向上

           k  ^  向下

           注意:可以[num]h,l,j,k,指定移动多少个字符;

             ^

             k              

       < h       l >               

             j                     

             v

        (2)以单词为单位移动

            w: 移至下一个单词的词首

            e: 跳至当前或下一个单词的词尾

            b: 跳至当前或前一个单词的词首

           注意:可以[num]w,e,b,跟移动多少个单词

 

       (3)行内跳转:

            0: 绝对行首

            ^: 行首的第一个非空白字符

            $: 绝对行尾

       (4)行间跳转

            gg:跳至第一行;

            G:跳至最后一行;

            [num]G:跳至指定行;

           

        (5)末行模式 [num] 直接给定行号

          

        (6)在编辑模式下翻屏

            Ctrl+f: 向下翻一屏

            Ctrl+d: 向下翻半屏

            Ctrl+b: 向上翻一屏

            Ctrl+u: 向上翻半屏

6.编辑模式下删除

        (1)删除单个字符;

             x:删除光标所在处的单个字符;

            [num]x:指定向光标所在到向后的指定个字符;

        (2)删除命令d

            dd:删除当前光标所在整行

            d0:删除当前光标其前到当前行首的所有字符;

            d$:删除当前光标其后到当前行尾的所有字符;

            dw:删除当前光标所在的单词;

            [num]dw:删除当前光标向后的指定单词个数;

            de:删除当前光标所在的单词包括所在其后的单词; 

            [num]de:删除当前光标所在的单词包括其后指定单词的个数;

            db:删除当前光标所在其前的单词;

            [num]db:删除当前光标其前指定的单词个数;

7.末行模式删除操作:

        :startADD,endADDd

          . 表示当前行

          $ 表示最后一行;

          +[num] 表示从当前向下指定的行数;

8.编辑模式下黏贴命令p

       p: 如果删除或复制为整行内容,则粘贴至光标所在行的下方,如果复制或删除的内容为非整行,

          则粘贴至光标所在字符的后面;

       P: 如果删除或复制为整行内容,则粘贴至光标所在行的上方,如果复制或删除的内容为非整行,

          则粘贴至光标所在字符的前面; 

        

9.编辑模式下复制命令y

            yy:复制当前光标所在整行

            y0:复制当前光标其前到当前行首的所有字符;

            y$:复制当前光标其后到当前行尾的所有字符;

            yw:复制当前光标所在的单词;

            [num]yw:复制当前光标向后的指定单词个数;

            ye:复制当前光标所在的单词包括所在其后的单词; 

            [num]ye:复制当前光标所在的单词包括其后指定单词的个数;

            yb:复制当前光标所在其前的单词;

            [num]yb:复制当前光标其前指定的单词个数;

       

10.编辑模式下修改命令c:先删除内容,再转换为输入模式

            cc:删除当前光标所在整行;进入输入模式

            c0:删除当前光标其前到当前行首的所有字符;进入输入模式

            c$:删除当前光标其后到当前行尾的所有字符;进入输入模式

            cw:删除当前光标所在的单词;进入输入模式

            [num]cw:删除当前光标向后的指定单词个数;进入输入模式

            ce:删除当前光标所在的单词包括所在其后的单词;进入输入模式 

            [num]ce:删除当前光标所在的单词包括其后指定单词的个数;进入输入模式

            cb:删除当前光标所在其前的单词;进入输入模式

            [num]cb:删除当前光标其前指定的单词个数;进入输入模式    

    

11.编辑模式下替换命令r

            r:替换单个字符;    

            R:替换单个单词替换后进入输入模式

12.编辑模式下撤销命令u

            u:撤销前一次编辑操作;

            连续uu可撤销此前多次编辑操作

            #u:撤销最近#次编辑操作;

13.编辑模式下重复前一次操作命令.

        . 重复前一次编辑操作;

14.可视化光标选取模式:

            v:逐字符选取;

            V:矩形选取;

15.末行式下查找

            /pattern 从当前光标所在处向下查找

                n 对查找到的内容向下跳转

                N 对查找到的内荣向上跳转;

            ?pattern  从当前光标所在处向上查找;

                N 对查找到的内容向下跳转

                n 对查找到的内荣向上跳转; 

  

16.查找并替换在末行模式下使用s命令

            ADDR1,ADDR2s@PATTERN@string@gi

            $:最后一行

            %:表示全文             

           .:表示当前行

           $:表示最后一行;

            #:指定行

            +[num] 表示从当前向下指定的行数;

            

            修饰符;

            g:全局替换

            i:忽略大小写; 

   

17.使用vim编辑多个文件

           vim FILE1 FILE2 FILE3

           :next 切换至下一个文件

           :prev 切换至前一个文件

           :last 切换至最后一个文件

           :first 切换至第一个文件

           :qa 部退出

18.屏显拆分

           Ctrl+w, s: 水平拆分窗口

           Ctrl+w, v: 垂直拆分窗口

           在窗口间切换光标:

           Ctrl+w, hljk

           :qa 关闭所有窗口

19.分窗口编辑多个文件

          vim -o : 水平分割显示

          vim -O : 垂直分割显示

20.末行模式下使用w命令:

        将当前文件中部分内容另存为另外一个文件;

       :w

       :ADDR1,ADDR2w /path/to/somewhere

21.末行模式下使用r命令:

        将另外一个文件的内容填充在当前文件中

        :r /path/to/somefile

22.跟shell交互

        :! COMMAND

23.高级功能

        1、显示或取消显示行号

           显示:set nu

           取消:set nonu

        2.显示忽略或区分字符大小写

           显示:set ignorecase

           取消:set noic

 

        3.设定自动缩进

           开启:set autoindent

               :set ai

           关闭:set noai

   

        4.查找到的文本高亮显示或取消

           显示:set hlsearch

           取消:set nohlsearch

        5.语法高亮

           显示:syntax on

           关闭:syntax off

24.配置文件

        /etc/vimrc:定义全局配置文件,对所有用户生效;

        ~/.vimrc :定义用户个人配置文件,只对单用户生效; 

原创文章,作者:xiashixiang,如若转载,请注明出处:http://www.178linux.com/32841