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/Unix下安装一平台时往往需要十几甚至更多安装包,这些源码包来源于网络、本地硬盘、移动设备。有时碰到网络不畅通或下载地址失效会带来很多麻烦,一个好方法便是将常用的软件包下载到本地硬盘存放。问题是久而久之连自己都不晓得哪些包才是适用的。现用makeself来实现自解压倒安装倒是一个很好的解决方案,下面以制作Func客户端安装包为例。 一、…

    Linux干货 2015-03-27
  • 逻辑卷LVM

    逻辑卷LVM 简介     在实际生产应用中,磁盘的分区的容量是固定不变的,当出现分区容量不足的情况,除了新加磁盘,还有没有其他方法呢?    逻辑卷(LVM)的概念就出现了,全称叫Logical Volume Manager。它的作用是允许对卷进行方便操作的抽象层,包括重新设定…

    Linux干货 2017-08-12
  • LVM 逻辑卷管理器-增大LV容量

    LVM 逻辑卷管理器-增大LV的容量   步骤: (1)新增一个8e systemID的分区; (2)用pvcreate命令构建PV; (3)用vgextend命令将PV加入vg_1; (4)用lvresize命令将新加入的PV内的PE加入lv_1中; (5)通过resize2fs命令将LV的容量扩充到整个文件系统;   (1)新增一个8…

    Linux干货 2016-09-19
  • Bash Shell详解

    引言:什么是Shell? Linux的命令行接口归结起来就是各种Shell,那么到底什么是Shell?Shell,译为外壳,是用户直接连入计算机所使用的计算机程序,负责解析用户提供的命令,如词法分析、语法分析、句法分析。 1.Shell的分类 Linux 的命令 shell 是与操作系统相分离的一层。不同的 shell 环境影响您具备不同的功能,比如可编辑的…

    2017-09-07
  • MySQL常见备份与恢复方案

    MySQL常见备份方案有以下三种:        mysqldump + binlog        lvm + binlog          xtrabac…

    Linux干货 2015-10-01
  • GNU awk

    GNU awk:      文本处理三剑客:grep,sed,awk            grep,egrep,fgrep:文本过滤工具;pattern     &nb…

    Linux干货 2017-05-22