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

相关推荐

  • shell中的if else语句与文件查找find浅析

    shell中的if else语句与文件查找find浅析    上篇文章中我们讲述了shell脚本编程的初步入门,其中讲到了shell编程中的顺序执行,顺序执行时一种简单的小脚本,如果在编辑脚本的时候遇到要做出条件判断执行的时候要怎么办呢?我们学习过if之后你会发现这会很简单。if 语句通过关系运算符判断表达式的真假来决定执行哪个分支。 S…

    Linux干货 2016-08-16
  • Linux文本处理工具

    知识框架图 学习笔记 查看文本 查看文本内容 cat -A:显示控制符 -E:显示行结束符$ -n:打印行号,显示空行 -b:打印行号,空行不编号 -s:压缩连续空白行 tac:反向查看文件内容 rev:文本每行倒序显示 分页查看 more less 查看文件头尾内容 head -c:前n个字节 -n:前n行 tail -c -n -f:跟踪显示文件变化,常…

    2018-03-17
  • 网络管理及任务进程解析

     网络管理————————————— 一.IP 地址 与路由  1.首先说的是IP地址:       它们可唯一标识IP 网络中的设备,每台主机必须具有唯…

    2017-07-02
  • N22-第一周作业

    1、描述计算机的组成及功能      计算机系统由硬件系统和软件系统组成。硬件系统(Hardware system)是计算机完成计算工作  的物质基础。软件系统(Software system):是在计算机硬件设备上运行的各种程序,是介于用户  和硬件系统之间的界面。1.1 计算机的硬件系…

    Linux干货 2016-08-22
  • Linux 登录趣事

    初入Linux运维,在虚拟机VMware12中装载CentOS6和CentOS7,均带有图形化界面。简单熟悉Linux,发现了一些关于登录的趣事,在此与大家分享。 运行环境:CentOS6和CentOS7 工具:系统里的terminal 登录趣事(以CentOS6为例): (1)自动登录图形化界面 每次启动CentOS6,短暂等待之后便会进入登录界面,然后选…

    2017-07-15
  • 深入了解正则表达式与grep应用

    刚开始学习正则表达式时候,感觉和看无字天书没什么分别,迷茫了一段时间后,仔细去理解,慢慢你会发现也没什么的。认真去钻研了,多练习,是可以理解他们的含义的。也许正如老师所言,学习linux ,入门的确很陡峭,对于我这个基础薄弱,智商低于80的人来说的确很吃力。关于正则概念的就不去描述了,说起来真的不好表达,下面通过一些实例来进行深入理解吧。 1.显示当前系统上…

    2017-11-01