SED{shell三剑客awk,sed,grep}

SED [选项][动作]:

      Linux sed命令是利用脚本来处理文本文件

      sed可依照脚本的指令来处理、编辑文本文件。

      sed主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等。

      选项与参数:
          -n:使用安静(silent)模式。在一般sed的用法中,所有来自STDIN的数据一般都会被列出到终端上。但如果加上-n参数后,则只有经过sed特殊处理的哪一行(或者动作)才会被列出来

          -e:直接在命令列模式上进行sed的动作编辑;(允许在同一行里执行多条命令)

          -f:直接将sed的动作写在一个文件内,-f filename则可以运行filename内的sed动作;

          -r:sed的动作支持的是眼神型正规表示法的语法。(默认是基础正规表示法语法)

          -i:直接将修改读取的文件内容,而不是输出到终端

          function:

          a:新增行,a的后面可以是字串,而这些字串会在新的一行出现(目前的下一行)

          c:取代行,c的后面可以接字串,这些字串可以取代n1,n2之间的行

          d:删除行,因为是删除,所以d后面通常不接待任何参数,直接删除地址表示的行;

          i:插入行,i的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)

          p:列印,亦即将某个选择的数据印出。通常p会与参数sed -n一起运行

          s:替换,可以直接进行替换的工作,通常这个s的动作可以搭配正规表示法,例如1,20s/old/new/g 一般是替换符合条件的字符串而不是整行

          一般function的前面会有一个地址的限制,例如【地址】function,表示我们的动作要操作的行。下面我们通过具体的例子直观的看看sed的使用方法

 

           获取ens33网卡的ip

 

            

            

         实现tab和回车的命令

            

          sed -e '2a5\t\t\n5' num.sh  空格+回车

                                                     

 

               方法二:

                [root@ localhost ~]# sed -e '2a \
                > 3 \
                     > \t4 \
                          > 5 \
                > ' num.sh
               1 1 1 1 1 1
               1 1 1 1 1 1
               3 
               4 
               5

               1 1 1 1 1 1
               1 1 1 1 1 1
               [root@ localhost ~]#

         首先,要弄一个txt的文件,删除 sed d,1,2是一行二行,你想要删除第几行就写第几行,若要只删除第二行请写zd,(m,n)

               

                 

 

         /2/是一个正则表达式,在sed中正则表达式是在/.../两个斜杠中间的,这个正则的意思是寻找所有包含2的行,执行相应的操作,也就是删除所有包含2的行,如果我们只想删除以开头的行呢,只需要修改一下正则表达式就可以了:

       (1)        (2)

 

       其中a命令表示在指定行的后面附加一行,la这是在第一行的后面添加一行,添加的内容就是a后面的内容,如果a的前面没有地址限定则在所有行的后面都会添加指定的字符串

                   (1a在第一行的后面附加一行)

 

 

       命令i表示在指定的行的前面插入一行,差的内容为其后面的字符串

            

 

        命令c会替换指定的行的所有内容,替换成其后面的字符串,所有的新增,删除,替换行,这些命令前面的地址

             

      替换以二开头的行,其内容是c命令后面的字符串

         

 

      sed中除了上面的命令市政对整行进行操作的之外,还提供一个替换命令,该命令对某一行中的部分字符串进行操作,下面举一个简单的例子,还是同样的文本内容,执行下面的命令:

            (1)    (2)

 

      

 

      可以看到第六行的ccaa中的aa是没有被替换的,也就是说他只替换了每一行搜索到的第一个aa字符串进行操作,那么如果要对一行里面的所有的符合条件的字符串都做替换操作,我们可以使用参数g(全局):

         (1)    (2)

 

       只替换某一行的参数,我们就需要用到行数 ,以x来做一下数,比如我们要替换x行,就写成xs:

           (1)    (2)方法二:

 

 

      我们在s命令前添加^[0-9]/这个修饰,该正则表达式表示对所有以数字开头的行,执行s操作

            

 

     sed还提供了一个p命令用域搜索符合条件的行,并输出该行的内容,而不做其他的任何修改。可以看出来第二行被输出来了,但是sed好像将文件的所有内容输出了一遍,而第二行则多输出了一次,实际上sed默认情况下是会将所有标准输入的数据又重新输出到标准输出的,我们可以加上-n选项让sed仅仅是输出经过处理之后的那些行,而不是输出之前从标准输入中获取到的所有行内容。【这样仅仅会输出p命令就处理结果了,-n选项一般是与p命令联合使用的,其他的增加,删除,替换行的命令是不需要-n选项的】:

 

           (1)                 (2)

        

     将修改应用到文件中

          我们之前作的所有实验,实际上都没有修改fast.txt文件的内容,也就是说我们看到的修改结果仅仅输出到控制台上,而文件fast.txt的内容是没有修改的,我们可以使用-i选项告诉sed直接修改文件的内容,而不是将修改结果输出到终端上

     

 

   sed正则的元字符:

      我们知道sed中的命令前面可以使用地址范围进行限制,表示对文件的某些符合条件的行执行相应的操作,其中我们可以使用正则表达式选出要操作的行,sed中正则的语法可能与我们其他的命令的正则语法有些不同:因此列出sed的正则符号:

          $ 表示行尾

          ^ 表示行首

          [a-z0-9]表示字符范围

          [^]表示除了字符集中的字符以外的字符

             sed的正则中\(\)和\{m,n\}需要转义

             . 表示任意字符

           * 表示零个或者多个

           \+ 一次或多次

           \? 零次或一次

           \| 表示或语法 

posted @ 2020-01-11 09:55  h0001  阅读(140)  评论(0编辑  收藏  举报