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 09:37
下一篇 2016-08-11 09:37

相关推荐

  • Nginx负载均衡和动静分离

    实验目的:实现Nginx的负载均衡和动静分离 实现环境:一台server用作Nginx代理(需要两块网卡,eth0连接内网,eth1连接外网),两台用作web服务(每台server都定义两个虚拟机,端口分别是80和8080),一台客户端用于验证结果; 操作步骤 负载均衡的实现: 一、配置IP 1.配置A主机的IP # ip addr add dev eth0…

    2017-05-13
  • N26-第七周

    1、创建一个10G分区,并格式为ext4文件系统;   (1) 要求其block大小为2048, 预留空间百分比为2, 卷标为MYDATA, 默认挂载属性包含acl;    (2) 挂载至/data/mydata目录,要求挂载时禁止程序自动运行,且不更新文件的访问时间戳; [root@localhost ~]# fdi…

    Linux干货 2017-03-05
  • linux 文本切片处理技巧

    shell中截取字符串的方法有很多中, ${expression}一共有9种使用方法。 ${parameter:-word} ${parameter:=word} ${parameter:?word} ${parameter:+word} 上面4种可以用来进行缺省值的替换。 ${#parameter} 上面这种可以获得字符串的长度。 ${parameter%…

    Linux干货 2017-04-04
  • 网络班N_27第三周作业

    1、   列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。 [root@localhost ~]# who |cut-d” ” -f1 | sort -u 2、   取出左后登录到当前系统的用户的相关信息。 [root@localhost ~]# id `l…

    2017-08-11
  • shell脚本之测试命令(test、[])

    话不多说,直接开车 在编写shell脚本中,我们经常需要判断命令执行的正确与否,从而进行不同的操作。首先我们来介绍下条件性的执行操作符:根据退出状态而定,命令可以有条件地运行。其中,利用echo的话方便我们对测试结果的查看。 (1)&& 代表条件性的AND THEN 可以理解为短路与:当&&前面命令为真时,执行&am…

    Linux干货 2017-08-05
  • 自制linux系统

    自制linux系统  需要为虚拟机新增一个硬盘,作为自制linux系统的载体。也可以用U盘、移动硬盘或其他设备作为载体实验步骤: (1)为虚拟机新增一个大小为20G的硬盘(2)给新增的磁盘分区,划分/boot、swap、/三个分区比如,将第一个分区当作boot,大小为500M;第二个分区当作swap分区,大小为2G;第三个分区用作/,大小为10G。…

    Linux干货 2016-09-13