1. <tr id='jo7pc'><strong id='jo7pc'></strong><small id='jo7pc'></small><button id='jo7pc'></button><li id='jo7pc'><noscript id='jo7pc'><big id='jo7pc'></big><dt id='jo7pc'></dt></noscript></li></tr><ol id='jo7pc'><table id='jo7pc'><blockquote id='jo7pc'><tbody id='jo7pc'></tbody></blockquote></table></ol><u id='jo7pc'></u><kbd id='jo7pc'><kbd id='jo7pc'></kbd></kbd>
  2. <acronym id='jo7pc'><em id='jo7pc'></em><td id='jo7pc'><div id='jo7pc'></div></td></acronym><address id='jo7pc'><big id='jo7pc'><big id='jo7pc'></big><legend id='jo7pc'></legend></big></address>

    1. <ins id='jo7pc'></ins>

      <dl id='jo7pc'></dl>
      <i id='jo7pc'><div id='jo7pc'><ins id='jo7pc'></ins></div></i>

        <fieldset id='jo7pc'></fieldset>
        <span id='jo7pc'></span>

          <code id='jo7pc'><strong id='jo7pc'></strong></code>
          <i id='jo7pc'></i>

          Linux中文本处理命令sed的使用示例分享

          • 时间:
          • 浏览:6
          • 来源:124软件资讯网

              sed对文本的处置惩罚很强盛  ,而且sed很是小  ,参数少  ,容易掌握  ,他的操作方式根awk有点像  。sed按顺序逐行读取文件  。然后 ,它执行为该行指定的所有操作  ,并在完成请求的修改之后的内容显示出来 ,也可以存放到文件中  。完成了一行上的所有操作之后 ,它读取文件的下一行 ,然后重复该历程直到它完成该文件  。在这里要注重一点  ,源文件(默认地)保持不被修改  。sed 默认读取整个文件并对其中的每一行举行修改 。说白了就是一行一行的操作 。我用sed主要就是用内里的替换功效  ,真的很强盛  。下面以实例  ,详细的说一下 ,先从替换最先  ,最常用的 。

              参数

              sed -h

              -n, --quiet, --silent 作废自动打印模式空间

              -e 剧本, --expression=剧本 添加“剧本”到法式的运行列表

              -f 剧本文件, --file=剧本文件 添加“剧本文件”到法式的运行列表

              --follow-symlinks 直接修改文件时追随软链接

              -i[扩展名], --in-place[=扩展名] 直接修改文件(若是指定扩展名就备份文件)

              -l N, --line-length=N 指定“l”下令的换行期望长度

              --posix 关闭所有 GNU 扩展

              -r, --regexp-extended 在剧本中使用扩展正则表达式

              -s, --separate 将输入文件视为各个自力的文件而不是一个长的一连输入

              -u, --unbuffered 从输入文件读取最少的数据 ,更频仍的刷新输出

              --help 打印资助并退出

              --version 输出书本信息并退出

              例1

              测试文件

              代码如下:

              root:x:0:0:root:/root:/bin/bash

              bin:x:1:1:bin:/bin:/bin/false

              daemon:x:2:2:daemon:/sbin:/bin/false

              mail:x:8:12:mail:/var/spool/mail:/bin/false

              ftp:x:14:11:ftp:/home/ftp:/bin/false

              &nobody:$:99:99:nobody:/:/bin/false

              zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash

              http:x:33:33::/srv/http:/bin/false

              dbus:x:81:81:System message bus:/:/bin/false

              hal:x:82:82:HAL daemon:/:/bin/false

              mysql:x:89:89::/var/lib/mysql:/bin/false

              aaa:x:1001:1001::/home/aaa:/bin/bash

              ba:x:1002:1002::/home/zhangy:/bin/bash

              test:x:1003:1003::/home/test:/bin/bash

              @zhangying:*:1004:1004::/home/test:/bin/bash

              policykit:x:102:1005:Po

              例a,这个例子  ,把test文件中的root替换成tankzhang  ,只不外只替换一次及终止在这一行的操作 ,转到下一行

              代码如下:

              [zhangy@BlackGhost mytest]# sed 's/root/tankzhang/' test |grep tank

              tankzhang:x:0:0:root:/root:/bin/bash

              例b,这个例子  ,用tankzhang把文件test中的root所有替换掉  ,请注重g这个字母  ,global的缩写

              代码如下:

              [zhangy@BlackGhost mytest]# sed 's/root/tankzhang/g' test |grep zhang

              tankzhang:x:0:0:tankzhang:/tankzhang:/bin/bash

              zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash

              ba:x:1002:1002::/home/zhangy:/bin/bash

              @zhangying:*:1004:1004::/home/test:/bin/bash

              例c,加了-n p后表现只打印那些发生替换的行(部门替换)  ,上面的例子  ,我并没有加上grep

              代码如下:

              [zhangy@BlackGhost mytest]# sed -n 's/root/tankzhang/p' test

              tankzhang:x:0:0:root:/root:/bin/bash

              例d,加了-n pg后表现只打印那些发生替换的行(所有替换)  ,上面的例子 ,我并没有加上grep

              代码如下:

              [zhangy@BlackGhost mytest]# sed -n 's/root/tankzhang/pg' test

              tankzhang:x:0:0:tankzhang:/tankzhang:/bin/bash

              例e,在第二行  ,到第八行之间  ,替换以zhang开头的行  ,用ying来替换  ,并显示替换的行

              代码如下:

              [zhangy@BlackGhost mytest]# cat test | sed -ne '2,8s/^zhang/ying/gp'

              yingy:x:1000:100:,,,:/home/zhangy:/bin/bash

              例f,当有多个下令要执行时 ,可以用分号来离开  ,而且分开符可以自界说  ,默认是/  。上面的例子意思是在第二行  ,到第八行之间  ,替换以zhang开头的行 ,用ying来替换  ,在5 ,到10间  ,用goodbay来替换dbus  ,并显示替换的行

              代码如下:

              [zhangy@BlackGhost mytest]# cat test | sed -n '2,8s/^zhang/ying/gp;5,10s#dbus#goodbay#gp'

              yingy:x:1000:100:,,,:/home/zhangy:/bin/bash

              goodbay:x:81:81:System message bus:/:/bin/false

              例g,这个例子根上面的谁人例子一样  ,只不外有一点差别  ,那就是-e来充当了分号的作用  ,-e也能支解多个下令  。

              代码如下:

              [zhangy@BlackGhost mytest]# cat test | sed -ne '2,8s/zhang/ying/gp' -ne '5,10s#dbus#goodbay#gp'

              yingy:x:1000:100:,,,:/home/yingy:/bin/bash

              goodbay:x:81:81:System message bus:/:/bin/false

              例h,正则的用法  ,在sed内里用括号的话要加上\的 ,否则会报错的  。

              代码如下:

              [zhangy@BlackGhost mytest]# sed -ne '2,8s/^\(zhangy\)/\1ing/gp' test

              zhangying:x:1000:100:,,,:/home/zhangy:/bin/bash

              [root@masters ~]# sed -ne '2,8s/^\(zhangy\)/&ing/gp' test

              zhangying:x:1000:100:,,,:/home/zhangy:/bin/bash

              例i,&的用处是  ,在找到的字符串后加上&后面的字符串  ,zhang后都加上了ying

              代码如下:

              [zhangy@BlackGhost mytest]# sed -ne '2,15s/zhang/&ying/gp' test

              zhangyingy:x:1000:100:,,,:/home/zhangyingy:/bin/bash

              ba:x:1002:1002::/home/zhangyingy:/bin/bash

              @zhangyingying:*:1004:1004::/home/test:/bin/bash

              例j,这个例子是说 ,在以zhang开头的行最先  ,到匹配Po的行竣事 ,在他们之间举行替换

              代码如下:

              [zhangy@BlackGhost mytest]# sed -ne '/^zhang/,/Po/s/zhang/ying/gp' test

              yingy:x:1000:100:,,,:/home/yingy:/bin/bash

              ba:x:1002:1002::/home/yingy:/bin/bash

              @yingying:*:1004:1004::/home/test:/bin/bash

              例k,n;这里的n是next的缩写  ,找到root的行后  ,将其下一行的中的bin换成tank

              代码如下:

              [zhangy@BlackGhost mytest]$ sed '/root/{n;s/bin/tank/}' test

              root:x:0:0:root:/root:/bin/bash

              tank:x:1:1:bin:/bin:/bin/false

              例m,y的作用是将匹配的字符换成大写  ,不外替换字符和被替换字符长度要一样

              代码如下:

              [zhangy@BlackGhost mytest]$ sed -e '1,2y/root/ROOT/' test

              ROOT:x:0:0:ROOT:/ROOT:/bin/bash

              bin:x:1:1:bin:/bin:/bin/false

              例n,h的作用是将找到的行  ,放到一个缓存区 ,G的作用是将缓存区中的内容放到最后一行

              代码如下:

              [zhangy@BlackGhost mytest]$ sed -e '/root/h' -e '$G' test

              ................................

              .............................

              ba:x:1002:1002::/home/zhangy:/bin/bash

              test:x:1003:1003::/home/test:/bin/bash

              @zhangying:*:1004:1004::/home/test:/bin/bash

              root:x:0:0:root:/root:/bin/bash

              例o,行替换  ,用匹配root的行  ,来替换匹配zhangy的行

              代码如下:

              [zhangy@BlackGhost mytest]$ sed -e '/root/h' -e '/zhangy/g' test

              root:x:0:0:root:/root:/bin/bash

              bin:x:1:1:bin:/bin:/bin/false

              daemon:x:2:2:daemon:/sbin:/bin/false

              mail:x:8:12:mail:/var/spool/mail:/bin/false

              ftp:x:14:11:ftp:/home/ftp:/bin/false

              &nobody:$:99:99:nobody:/:/bin/false

              root:x:0:0:root:/root:/bin/bash

              http:x:33:33::/srv/http:/bin/false

              dbus:x:81:81:System message bus:/:/bin/false

              hal:x:82:82:HAL daemon:/:/bin/false

              mysql:x:89:89::/var/lib/mysql:/bin/false

              aaa:x:1001:1001::/home/aaa:/bin/bash

              root:x:0:0:root:/root:/bin/bash

              test:x:1003:1003::/home/test:/bin/bash

              root:x:0:0:root:/root:/bin/bash

              例p,这个例子是说  ,在以zhang开头的行最先 ,到匹配Po的行竣事 ,在他们之间举行替换

              代码如下:

              [zhangy@BlackGhost mytest]# sed -ne '/^zhang/,/Po/s/zhang/ying/gp' test

              yingy:x:1000:100:,,,:/home/yingy:/bin/bash

              ba:x:1002:1002::/home/yingy:/bin/bash

              @yingying:*:1004:1004::/home/test:/bin/bash

              例q,3q的意思是到第三行的时间  ,退出

              代码如下:

              [zhangy@BlackGhost mytest]$ sed -e 's/bin/tank/g;3q' test

              root:x:0:0:root:/root:/tank/bash

              tank:x:1:1:tank:/tank:/tank/false

              daemon:x:2:2:daemon:/stank:/tank/false

              例r,特殊匹配

              匹配数字别忘了中括号外面另有一其中括号 。

              [:alnum:] 字母数字 [a-z A-Z 0-9]

              [:alpha:] 字母 [a-z A-Z]

              [:blank:] 空格或制表键

              [:cntrl:] 任何控制字符

              [:digit:] 数字 [0-9]

              [:graph:] 任何可视字符(无空格)

              [:lower:] 小写 [a-z]

              [:print:] 非控制字符

              [:punct:] 标点字符

              [:space:] 空格

              [:upper:] 大写 [A-Z]

              [:xdigit:] 十六进制数字 [0-9 a-f A-F]

              代码如下:

              [zhangy@BlackGhost mytest]# sed -ne '2,15s/zhangy.*[[:digit:]]/=======/gp' test

              =======:,,,:/home/zhangy:/bin/bash

              @=======::/home/test:/bin/bash

              例2

              例a,删除1  ,14行

              代码如下:

              [zhangy@BlackGhost test]$ sed -e '1,14d' test

              @zhangying:*:1004:1004::/home/test:/bin/bash

              policykit:x:102:1005:Po

              例b,删除4以后的行  ,包罗第4行  ,把$当成最大行数就行了  。

              代码如下:

              [zhangy@BlackGhost mytest]$ sed -e '4,$d' test

              root:x:0:0:root:/root:/bin/bash

              bin:x:1:1:bin:/bin:/bin/false

              daemon:x:2:2:daemon:/sbin:/bin/false

              例c,删除包罗false的行  ,或者包罗bash的行  ,别忘了加\

              代码如下:

              [zhangy@BlackGhost mytest]$ sed -e '/\(false\|bash\)$/d' test

              policykit:x:102:1005:Po

              例d,删除从匹配root的行  ,到匹配以test开头的行  ,中心的行

              代码如下:

              [zhangy@BlackGhost mytest]$ sed -e '/root/,/^test/d' test

              @zhangying:*:1004:1004::/home/test:/bin/bash

              policykit:x:102:1005:Po

              例3

              例a,读取test2的内容 ,并将其写入到匹配行的下面

              代码如下:

              [zhangy@BlackGhost mytest]$ sed -e '/^root/r test2' test

              root:x:0:0:root:/root:/bin/bash

              =============

              -------------

              +++++++++++++

              bin:x:1:1:bin:/bin:/bin/false

              daemon:x:2:2:daemon:/sbin:/bin/false

              例b,将匹配数字的行  ,写入test2中

              代码如下:

              [zhangy@BlackGhost mytest]$ sed '/[[:digit:]]/w test2' test

              例c,将要插入的工具 ,插入匹配行的下面

              代码如下:

              [zhangy@BlackGhost mytest]$ sed '/root/a\\ ===aaaa====' test

              root:x:0:0:root:/root:/bin/bash

              ===aaaa====

              bin:x:1:1:bin:/bin:/bin/false

              例d,正好根a相反  ,将要插入的工具  ,插入到匹配行的上面

              代码如下:

              [zhangy@BlackGhost mytest]$ sed '/^daemon/i\\=================' test

              root:x:0:0:root:/root:/bin/bash

              bin:x:1:1:bin:/bin:/bin/false

              =================

              daemon:x:2:2:daemon:/sbin:/bin/false

              mail:x:8:12:mail:/var/spool/mail:/bin/false

              例4

              #取得一个文件(或目录)路径的父目录,s@@@为替换花样,\(/.*/\)是指一个"/"后面跟了恣意字符又跟了一个"/",其中\(\)是用来把匹配内容作为一个整体后向引用,[^/]\{1,\}是指一个非"/"字符泛起了一次,两次,或多次;/\?是指"/"泛起了0次或1次,\1是后向引用前面匹配的内容

              代码如下:

              [root@practice ~]# echo "/usr/local/bin/" |sed 's@\(/.*/\)[^/]\{1,\}/\?@\1@'

              /usr/local/

              #使用扩展正则表达式后,亦可云云:

              [root@practice ~]# echo "/etc/rc.d/rc.sysinit" | sed -r 's@(/.*/)[^/]+/?@\1@'

              /etc/rc.d/