sed命令应用详解

sed应用详解

sed是文本处理处理工具“三大剑客”之一,它 是一种流编辑器,sed一次只处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern
space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。sed不会修改原文件内容,除非你使用重定向存储输出。sed主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等。

 用法:sed [OPTION]… {script-only-if-no-other-script} [input-file]…

sed可依照script来处理文本文件,skript又包含地址定界和编辑命令。地址定界是指定要处理的文件范围,比如只处理文件的前十行内容,或者只处理文件的奇数行等,编辑命令是指对指定范围的内容进行怎样的处理,比如在屏幕上打印显示,或者删除、替换等操作,地址定界和编辑命令必须配合使用,如果不指定地址定界则默认对全文进行处理。sed本身也有选项参数,常用的选项参数如下所示:

-n:仅显示经过script处理后的结果,默认情况下,sed会自动打印模式空间的内容

-e:可以指定多个script同时处理

-f /path/to/script_file:从指定的文件中读取脚本并运行

-r:支持使用扩展正则表达式

-i:直接修改源文件

script地址定界的方式有:

(1)若不指定范围则表示处理全文

(2)#:#代表数字,指定行号

(3)/pattern/:模式匹配,被/pattern/匹配到的所有行

(4)#1,#2:表示从第#1行到第#2行之间所有的行

(5)#,+n:表示从第#行开始再向下n行之间的所有行

(6)/pat1/,/pat2/:表示从第一次被/pat1/匹配到的行开始,到第一次被/pat2/匹配到的行结束,中间所有的行

(7)#,/pat1/:表示从第#行开始,到第一次被/pat1/匹配到的行结束,之间所有的行

(8)first~step:表示指定起始行以及步长,比如1~2,1代表起始行,2代表步长,匹配到的行即为1,3,5,7…(奇数行)

(9)$:表示最后一行

script编辑命令有:

d:删除模式空间中的行

[root@fengl testdir]# cat test     #先查看test原文件内容
1aaaaaaaaaaaaaaaa
2bbbbbbbbbbbbbbbb
3cccccccccccccccc
4dddddddddddddddd
5eeeeeeeeeeeeeeee
6ffffffffffffffff
[root@fengl testdir]# sed '1d' test   #删除第1行
2bbbbbbbbbbbbbbbb
3cccccccccccccccc
4dddddddddddddddd
5eeeeeeeeeeeeeeee
6ffffffffffffffff

p:打印模式空间中的行

[root@fengl testdir]# sed -n '/aaa/p' test     #只打印匹配“aaa”的行
1aaaaaaaaaaaaaaaa

a \text:在当前行下面追加文本,支持使用\n实现多行追加

[root@fengl testdir]# sed '1,3a\ggggggggg' test   #在1至3行下面插入“ggggggggg”
1aaaaaaaaaaaaaaaa
ggggggggg
2bbbbbbbbbbbbbbbb
ggggggggg
3cccccccccccccccc
ggggggggg
4dddddddddddddddd
5eeeeeeeeeeeeeeee
6ffffffffffffffff

i \text:在当前行下面插入文本,支持使用\n实现多行插入

[root@fengl testdir]# sed '2,+2i\ggggggggg' test      #在从第2行开始向下2行的上面插入“ggggggggg”
1aaaaaaaaaaaaaaaa
ggggggggg
2bbbbbbbbbbbbbbbb
ggggggggg
3cccccccccccccccc
ggggggggg
4dddddddddddddddd
5eeeeeeeeeeeeeeee
6ffffffffffffffff

c \text:把选定的行改为新的文本

[root@fengl testdir]# sed '/a/,/c/c\ggggggggg' test    #将第一次匹配到的‘a’所在行至‘c’所在行之间的所有内容更改为“ggggggggg”
ggggggggg
4dddddddddddddddd
5eeeeeeeeeeeeeeee
6ffffffffffffffff

=:为模式空间中的行打印行号

[root@fengl testdir]# sed -n '3,/f/=' test  #只显示从第3行开始到第一次匹配到“f”所在行之间的所有行的行号
3
4
5
6

s/regexp/replacement/:查找替换,替换由regexp所匹配到的内容为replacement,支持使用其他分隔符,条件是该分隔符在后面的模式中没有出现过,如s@@@或s###,对于替换还有后选项,如下:

    g:全局替换

    p:显示替换成功的行

    i:不区分大小写

[root@fengl testdir]# sed '1~2s/e/g/' test  #将奇数行中匹配到的第一个“e”替换成“g”
1aaaaaaaaaaaaaaaa
2bbbbbbbbbbbbbbbb
3cccccccccccccccc
4dddddddddddddddd
5geeeeeeeeeeeeeee
6ffffffffffffffff
[root@fengl testdir]# sed '1~2s/e/g/g' test #将奇数行中所有匹配到的“e”替换成“g”
1aaaaaaaaaaaaaaaa
2bbbbbbbbbbbbbbbb
3cccccccccccccccc
4dddddddddddddddd
5gggggggggggggggg
6ffffffffffffffff
[root@fengl testdir]# sed -n '1~2s/e/g/p' test   #将奇数行中所有匹配到的“e”替换成“g”,并只显示替换的行
5geeeeeeeeeeeeeee

w/path/to/somefile:把指定的内容另存至/path/to/somefile路径所指定的文件中

[root@fengl testdir]# sed -n '1,4w/testdir/testsave' test    #将test文件中的1至4行内容另存到/testdir/目录下的testsave文件中
[root@fengl testdir]# cat testsave    #查看testsave文件
1aaaaaaaaaaaaaaaa
2bbbbbbbbbbbbbbbb
3cccccccccccccccc
4dddddddddddddddd

r/path/form/somefile:在文件的指定位置插入另一个文件的所有内容,完成文件合并

[root@fengl testdir]# sed '3r/testdir/text' test   #将/testdir/text文件中的内容插入到test文件的第3行下面
1aaaaaaaaaaaaaaaa
2bbbbbbbbbbbbbbbb
3cccccccccccccccc
hhhhhhhhhhhhh
iiiiiiiiiiiii
jjjjjjjjjjjjj
4dddddddddddddddd
5eeeeeeeeeeeeeeee
6ffffffffffffffff

sed除了“模式空间”(pattern space)外,还有一个保持空间“hold space”。sed工作机制是每次读取一行文本至模式空间中, 在模式空间中完成处理,将处理结果输出值标准输出设备,在模式空间中处理一行内容后悔继续处理下一行,那么对于处理过的行可能还有其他的处理,因此可以先把处理过的行“传送”至保持空间中,然后在后续的处理中再次“传送”回模式空间中。

sed工具支持一些高级的命令运用到保持空间中,这些高级命令有:

h:用模式空间中的内容覆盖保持空间的内容

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

g:从保持空间中取出数据覆盖至模式空间

G:从保持空间中取出数据追加至模式空间

x:交换保持空间和模式空间的内容

n:读取匹配到的行的下一行覆盖至模式空间

N:读取匹配到的行的下一行追加至模式空间

d:删除模式空间中的内容

D:删除多行模式空间中的首行

注意:

!:取反,表示后面的命令对所有没有被选定的行发生作用

;:分号可用于分割脚本

示例1:

[root@fengl testdir]# sed -n 'n;p' test
2bbbbbbbbbbbbbbbb
4dddddddddddddddd
6ffffffffffffffff

sed的处理步骤为:

(1)因为n表示读取匹配到的行的下一行到模式空间中,因此第一次读取第1行时的动作是将第2行的内容覆盖至模式空间中,此时模式空间中的内容是第2行内容

(2)紧接着执行p操作,即打印模式空间的行(打印第2行内容)

(3)然后重复执行以上操作,继续读取下一行(即第3行,因为第2行已经读取过了),并将其下一行覆盖至模式空间(即模式空间的内容是第4行内容),然后再执行p操作(打印第4行内容),依次类推,直至文件读取完毕后结束sed运行

实例2:

[root@fengl testdir]# sed '1!G;h;$!d' test
6ffffffffffffffff
5eeeeeeeeeeeeeeee
4dddddddddddddddd
3cccccccccccccccc
2bbbbbbbbbbbbbbbb
1aaaaaaaaaaaaaaaa

sed的处理步骤为:

(1)读取文件的第一行内容到模式空间,因为第一行不执行G操作

(2)执行h操作,将模式空间的内容覆盖至保持空间

(3)因为不是最后一行,因此执行d操作,删错模式空间中的内容。此时模式空间内容为空,保持空间为第一行内容

(4)紧接着执行第2次循环,读取第2行内容,并执行G操作,将保持空间的内容追加至模式空间。此时模式空间为第2行和第1行内容,保持空间为第1行内容

(5)继续执行h操作,再把模式空间的内容覆盖至保持空间,因为第2行不是最后一行,然后在执行d操作,删除模式空间的内容。此时模式空间为空,保持空间为第2行和第1行内容(第1行内容在第2行下面)

(6)依次循环至文件最后一行,不执行d操作,此时模式空间的第1行内容为源文件的最后一行内容(行倒序排序),最后打印出模式空间的内容。

原创文章,作者:苦涩咖啡,如若转载,请注明出处:http://www.178linux.com/32621

(0)
苦涩咖啡苦涩咖啡
上一篇 2016-08-11
下一篇 2016-08-11

相关推荐

  • gawk基础及进阶

    GUN awk: 文本处理三工具:grep,sed,awd grep,egrep,fgrep:文本过滤工具:pattern sed:行编辑器 模式空间、保持空间 awk:报告生成器,格式化文本输出; AWK:Aho,Weinberger,Kernighan –> New AWK,NAWK GNU awk,gawk gawk – …

    Linux干货 2017-05-22
  • Linux简单的磁盘分区、格式化和挂载

     一.分区: 1.查看分区fdisk -l 通过fdisk -l 查看机器所挂硬盘个数及分区情况   2.通过上面的信息,我们知道此机器中挂载两个硬盘分别是:/dev/sda和/dev/sdb, 其中sda有两个主分区/dev/sda1和sda2; 其中sdb有1个扩展类型/dev/sdb3和3个逻辑分区sd…

    Linux干货 2016-02-28
  • 内键命令和外部命令

    命令的基本格式 COMMAND  [OPTIONS…]  [ARGUMENTS…]        命令 (COMMAND)       OPTIONS(选项):用于启用或关闭命令的某个或某些功能      …

    2017-05-23
  • VSFTP通过pam_mysql插件创建进行基于mysql的虚拟用户

      1、对pam_mysql-0.7RC1包进行编译安装 编译安装环境配置 编译安装所需的包如下: ~]#yum -y groupinstall "Development Tools" "Server Platform Development" ~]#yum -y install mariadb-server…

    Linux干货 2016-11-14
  • Centos 6.5下DNS服务器主从复制搭建及测试

    一、实验环境及IP地址规划     VMware Workstation 10.0, CentOS 6.5 X86系统     主DNS服务器:192.168.1.102     从DNS服务器:192.168.1.110     www服务器:  …

    Linux干货 2015-04-18
  • Linux安全与加密基础(一)

    Linux安全与加密基础(一) 常见的加密算法 SSL: Openssl与CA认证 ssh服务 dropbear AIDE sudo 常见的加密算法 密码学古以有之,尤其是在中国古代的战争中,在现在科技中,密码学不得不说是一门高深的学问,普通人知其一二足矣;本文要讨论的是关于加密与解密的基本原理与应用,以及关于Linux系统中的一些安全管理问题,如ssh服务…

    Linux干货 2016-10-06