sed工具实践解析

此次博文介绍一下文本处理三剑客中的sed工具(点击查看grep工具http://www.178linux.com/83512

介绍sed

sed是非交互式的编辑器。它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。

运行过程:

sed编辑器逐行处理文件,并将结果发送到屏幕。具体过程如下:首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间),然后处理模式空间中的行,完成后把该行打印到屏幕上。sed每处理完一行就将其从模式空间删除,然后将下一行读入,进行处理和显示。处理完输入文件的最后一行后,sed便结束运行。sed把每一行都存在模式空间中,对这个缓存副本进行编辑,所以不会修改原文件。如果没有对行处理的话,直接把行打印到屏幕上。

sed工具的使用

1)地址定界:

既然是对文件逐行处理,首先我们决定对哪些行进行编辑,即地址定界,如果没有指定地址,sed将处理输入文件的所有行,地址的形式可以是数字、正则表达式、或二者的结合以及其他可以表示指定行的语句。

<1>不指定地址:对全文进行处理

[root@localhost app]#sed -n 'p' test1    
1 one
2 ttwo
3 three
4 fffour
5 ffffive

<2>单地址:

#: 指定的行 或  /pattern/:被此处模式(基本正则表达式)所能够匹配到的每一行

[root@localhost app]#cat test1                         #假定一个实验文件
1 one
2 ttwo
3 three
4 fffour
5 ffffive
[root@localhost app]#sed -n '2p' test1                 #对指定行处理
2 ttwo
[root@localhost app]#sed -n '/\b[a-z]\{4\}\b/p' test1  #支持模式匹配
2 ttwo

<3>范围地址:

#,# 或 #,+# 或 /pat1/,/pat2/ 或 #,/pat1/

[root@localhost app]#sed -n '2,4p' test1                #第2行到第4hang
2 ttwo
3 three
4 fffour
[root@localhost app]#sed -n '2,+2p' test1               #第2行到第2+2行
......
[root@localhost app]#sed -n '/\b[a-z]\{4\}\b/,/\b[a-z]\{6\}\b/p' test1    #模式匹配行1到模式匹配行2
......
[root@localhost app]#sed -n '2,/\b[a-z]\{6\}\b/p' test1                   #第2行到模式匹配行
......

其他:

1~2 奇数行 或 2~2 偶数行

[root@localhost app]#sed -n '1~2p' test1                
1 one
3 three
5 ffffive
[root@localhost app]#sed -n '2~2p' test1  
2 ttwo
4 fffour

2sed用法:

sed [option]… ‘script’ inputfile…

<1>sed选项:

-n –quiet, –silent 取消默认自动打印模式空间的行

-e script –expression=script添加“脚本”到程序的运行列表,可以实现多点编辑

-f 脚本文件 :–file=脚本文件添加“脚本文件”到程序的运行列表,换行键入命令可以实现多点编辑

-r –regexp-extended 支持使用扩展正则表达式

-i.[扩展名] –in-place[=扩展名] 直接修改文件(如果指定扩展名就备份文件)

-s –separate 将输入文件视为各个独立的文件而不是一个长的连续输入,可以指定多个文件

[root@localhost app]#sed "2p" test1                #默认打印模式空间
1 one
2 ttwo
2 ttwo
3 three
4 fffour
5 ffffive
[root@localhost app]#sed -n "2p" test1             #取消默认打印模式空间
2 ttwo
[root@localhost app]#sed -e '2p' -e '3d' test1     #-e 多点编辑
1 one
2 ttwo
2 ttwo
4 fffour
5 ffffive
[root@localhost app]#cat test2
2p
3d
[root@localhost app]#sed -f test2 test1             # -f 添加文件编辑(文件内换行可以进行多点编辑)
1 one
2 ttwo
2 ttwo
4 fffour
5 ffffive
[root@localhost app]#sed -rn '2,/\b[a-z]{6}\b/p' test1  #-r 支持扩展正则表达式
......
[root@localhost app]#sed -sn '2p' passwd shadow    #-s 指定多个文件 bin:x:1:1:bin:/bin:/sbin/nologin
bin:*:17400:0:99999:7:::
[root@localhost app]#sed -i '2p' test1          #-i 直接对原文件编辑  
[root@localhost app]#sed -i.bak '2p' test1     #将原文件备份,直接编辑原文件

<2>sed命令:

sed命令告诉sed如何处理由地址定界指定的输入行

删除模式空间匹配的行 a [\]text 在指定行后面追加文本支持使用\n实现多行追加
q 结束或者退出sed i [\]text 在行前面插入文本
c [\]text 替换行为单行或多行文本 c [\]text 替换行为单行或多行文本
w /path/somefile 保存模式匹配的行至指定文件 r /path/somefile 读取指定文件的文本至模式空间中匹配到的行后
为模式空间中的行打印行号 模式空间中匹配行取反处理

[root@localhost app]#sed '2q' test1                 #到第二行退出sed
1 one
2 ttwo
[root@localhost app]#sed '2chello' test1            #将第二行替换为hello
1 one
hello
3 three
4 fffour
5 ffffive 
[root@localhost app]#sed '2ahello' test1            #在第二行后面添加一行hello
1 one
2 ttwo
hello
3 three
4 fffour
5 ffffive 
[root@localhost app]#sed '2a\                       #反斜杠\ 支持多行输入
> hello\
> nihao
> ' test1
1 one
2 ttwo
hello
nihao
3 three
4 fffour
5 ffffive
[root@localhost app]#sed '2ihello' test1            #在第二行前面添加一行hello
1 one
hello
2 ttwo
3 three
4 fffour
5 ffffive
[root@localhost app]#sed '2w /app/test2' test1      #将匹配到的第二行保存至文件
1 one
2 ttwo
3 three
4 fffour
5 ffffive
[root@localhost app]#cat test2
2 ttwo
[root@localhost app]#sed '3r /app/test2' test1      #将文件内容添加到匹配到的行后面
1 one
2 ttwo
3 three
2 ttwo
4 fffour
5 ffffive
[root@localhost app]#sed '=' test1                  #在每一行的上面另起一行显示行号
1
1 one
2
2 ttwo
3
3 three
4
4 fffour
5
5 ffffive
[root@localhost app]#sed '2!=' test1                #取反编辑,除了匹配到的行,对其余行进行处理
1
1 one
2 ttwo
3
3 three
4
4 fffour
5
5 ffffive

s/// : 查找替换,默认替换第一个被匹配到的字符串,支持使用其它分隔符,s@@@,s###

替换标记:g :行内全局替换  p :显示替换成功的行 w :/PATH/TO/SOMEFILE : 将替换成功的行保存至文件中

[root@localhost app]#sed 's/[a-z]/#/' test1       #默认替换匹配行所匹配到的第一个字符串
1 #ne
2 #two
3 #hree
4 #ffour
5 #fffive
[root@localhost app]#sed 's/[a-z]/#/g' test1      #-g 匹配行内全局替换
1 ###
2 ####
3 #####
4 ######
5 #######
[root@localhost app]#sed -n 's/[a-z]/#/p' test1   #-p 显示替换成功的行
1 #ne
2 #two
3 #hree
4 #ffour
5 #fffive
[root@localhost app]#sed -n 's/[a-z]/#/w /app/test2' test1    #将替换成功的行保存至文件
[root@localhost app]#cat test2
1 #ne
2 #two
3 #hree
4 #ffour
5 #fffive

注意:当匹配模式中含有与分隔符相同的符号时,应当换一种分隔符。,避免匹配模式中出现与分隔符相同的符号

比如:

[root@localhost app]#cat test3
123
4/6
7/9
[root@localhost app]#sed '2s///5/' test3      #分隔符与匹配模式相同容易出错
sed: -e expression #1, char 7: unknown option to `s'
[root@localhost app]#sed '2s@/@5@' test3      #换一种分隔符
123
456
7/9

高级编辑命令:

学习之前要了解到模式空间和保持空间,除了sed把当前正在处理的行保存在一个临时缓存区中的这个模式空间以外,还有一个保持空间(缓冲区、保留空间),默认为空行

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

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

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

G : 从保持空间取出内容追加至模式空间

: 把模式空间中的内容与保持空间中的内容进行互换

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

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

: 删除模式空间中的行

D : 删除当前模式空间开端至\n的内容(不再传至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed

通过具体的例子来学习sed高级编辑命令:

[root@localhost app]#sed 'h;G' test1    
 #先处理h,把匹配到的行(逐行)覆盖到保持空间,然后G,将保持空间的数据追加到模式空间,最后打印显示,这里是默认全部行
1 one
1 one
2 ttwo
2 ttwo
3 three
3 three
4 fffour
4 fffour
5 ffffive
5 ffffive
[root@localhost app]#sed '/one/h;/ttwo/x' test1   
#首先处理h,将匹配到的行(one)覆盖至保持空间,然后处理x,将模式空间中匹配到的行(ttwo)与保持空间的数据互换,最后打印显示
1 one
1 one
3 three
4 fffour
5 ffffive
[root@localhost app]#sed 'n;d' test1 
#先手处理n,将匹配到的行(逐行)的下一行覆盖至模式空间,然后处理d,将匹配到的模式空间的行删除,最后打印显示
1 one 3 three 5 ffffive
[root@localhost app]#sed 'N;D;d' test1 
#先手处理N,将匹配到行(逐行)追加到模式空间,然后处理D,删除模式空间开头至\n换行的数据,并且不执行后面的命令(;d),同时不打印显示并重新循环执行sed直至最后
5 ffffive

文本处理三剑客(grep,sed,awk)单独任何一个都足以写成一本书,此次介绍如有不足之处,敬请批评指出



原创文章,作者:Mozart,如若转载,请注明出处:http://www.178linux.com/85364

(0)
上一篇 2017-08-26 17:50
下一篇 2017-08-26 19:23

相关推荐

  • 进程管理

    linux维护工作中,常常需要对系统上运行的程序进行管理,那么进程管理就显得相当重要。 进程初识 什么是进程?   进程是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念。它代表CPU所能处理的单个任务。 什么是线程?   线程是程序流执行的最小单元,可以理解为进程中执行的一段程序片段。 进程与线程联…

    Linux干货 2016-09-07
  • 0806文本处理工具

    ———- 文件查看工具 ———- cat:    cat [OPTION]… [FILE]…   //查看文本文件内容,一般后面跟文件名(相对路径),或者是文件名(绝对路径) -n 加行号 -b 加行号,…

    Linux干货 2016-08-07
  • 文本处理三剑客之sed

    文本处理三剑客之sed 一、处理文本的工具sed 概念: Stream EDitor, 行编辑器 v sed是一种流编辑器,它一次处理一行内容。处理时,把 当前处理的行存储在临时缓冲区中,称为“模式空间”( pattern space),接着用sed命令处理缓冲区中的内容 ,处理完成后,把缓冲区的内容送往屏幕。接着处理下一 行,这样不断重复,直到文件末尾。文…

    Linux干货 2016-08-12
  • 编程命名中的7+1个提示

    前几天Neo写过《编程中的命名设计那点事》,这里也有另外一篇和程序命名的文章,可以从另一个角度看看。 1.- 变量应该是尽可能的望文知意。千万不要使用教材中的命名方式。 好的变量: daysDateRange, flightNumber, carColor. 坏的变量: days, dRange, temp, data, aux… 在我们…

    Linux干货 2015-04-03
  • 任务计划

    所谓计划任务就是指某一个时间系统自动做一件事情如输入指令或者保存文件等等 计划任务分两种:一次性计划任务命令(at)和周期性计划任务命令(crontab)at的用法:如果当前时间为2017年6月6日 at 18:00 2017-06-6 w > /root/who.txt init 0 (输入ctrl+d结束编辑…

    Linux干货 2017-06-07
  • 整型、浮点型在内存中的存储方式

      在学习C语言的过程中,有时候会想,数据到底是以什么样的方式在内存中存储的呢?经过一段时间的查阅资料,小编终于整理了一些…… 以VC6.0编译器为测试环境(int型为4Byte) 先简介一下大小端模式,具体资料可参考 http://blog.csdn.net/ce123_zhouwei/article/details/6971544  …

    Linux干货 2016-01-14