欢迎登陆真网站,您的到来是我们的荣幸。 登陆 注册 忘记密码? ☆设为首页 △加入收藏
欢迎加入真幸福QQ群
电脑知识: 基础知识 网络技术 操作系统 办公软件 电脑维修 电脑安全 windows7 windows8 windows10 服务器教程 平板电脑 视频播放教程 网络应用 互联网 工具软件 浏览器教程 QQ技巧 输入法教程 影视制作 YY教程 wps教程 word教程 Excel教程 PowerPoint
云南西双版纳特产小花糯玉米真空包装


Win7系统Intel MY WiFi技术如何使用
Win7如何正确使用Ready For 4GB
win7系统玩游戏经常遇到自动重启怎么解决?
win7系统网络打印机驱动怎么安装?
Win7系统怎样修改图片类型?
Win7系统任务管理器打不开怎么办?
win7右下角桌面网络图标出现感叹号怎么办
win7系统桌面图标白底方框的解决方法
利用“双行合一”功能实现WPS文字上下分散对齐的方法
Win7系统如何关闭IE升级IE11浏览器的提示?
Linux中文本处理命令sed的使用示例分享
【 来源:网络 】【 点击:1 】 【 发布时间:2017_03_03 08:59:59 】

   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/

本网站由川南居提供技术支持,fkzxf版权所有 浙ICP备12031891号
淳安分站 淳安分站