<dl id='6odvs'></dl>
<span id='6odvs'></span>
  • <i id='6odvs'><div id='6odvs'><ins id='6odvs'></ins></div></i>
    <i id='6odvs'></i>

          <ins id='6odvs'></ins>

          <code id='6odvs'><strong id='6odvs'></strong></code>
          1. <tr id='6odvs'><strong id='6odvs'></strong><small id='6odvs'></small><button id='6odvs'></button><li id='6odvs'><noscript id='6odvs'><big id='6odvs'></big><dt id='6odvs'></dt></noscript></li></tr><ol id='6odvs'><table id='6odvs'><blockquote id='6odvs'><tbody id='6odvs'></tbody></blockquote></table></ol><u id='6odvs'></u><kbd id='6odvs'><kbd id='6odvs'></kbd></kbd>
          2. <fieldset id='6odvs'></fieldset><acronym id='6odvs'><em id='6odvs'></em><td id='6odvs'><div id='6odvs'></div></td></acronym><address id='6odvs'><big id='6odvs'><big id='6odvs'></big><legend id='6odvs'></legend></big></address>
          3. Linux中文本处理命令sed的使用示例分享

            • 时间:
            • 浏览:11
            • 来源: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/