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)
MozartMozart
上一篇 2017-08-26
下一篇 2017-08-26

相关推荐

  • 文本编辑工具vim

                             vim +#: 打开文件直接处在#行 +/PATTERN:打开文件直接处在第一次匹配到行 vim + file :打开文件直接处在最后行 vim –b file :以二进制打开文件…

    Linux干货 2016-08-12
  • 小白易患错误之绝对路径和相对路径的操作错误

    小白易患错误之绝对路径和相对路径的操作错误 作为一个不安稳的小白,一天都在那路乱折腾,恰巧,老师课程题目中有一题将/etc/skel 这个目录的文件除了..和. 复制到/home/USRNAEM 的家目录下。然后自以为是不按照老师的方法,自己折腾用了这样一条命令 [root@local skel]# ls -A .bash_lo…

    Linux干货 2016-08-05
  • 数据库的备份和恢复

    数据库的备份和恢复 一 (理论篇)、数据库备份与恢复基础 1、数据库的备份与恢复 备份:存储的数据副本; 原始数据:持续改变; 恢复:把副本应用到线上系统; 仅能恢复至备份操作时刻的数据状态; 时间点恢复: binary logs; 2、为什么备份? 灾难恢复: 硬件故障(冗余)、软件故障(bug)、自然灾害、黑客攻击、误操作、…&nb…

    2016-11-22
  • RAID概述

    RAID 什么是RAID RAID(redundant arrays of independents disk,独立磁盘冗余阵列)是利用数组的方式组成磁盘组。RIAD大多是由廉价的磁盘组成容量巨大的磁盘组。,利用个别磁盘提供数据所产生的加成效果提升整个磁盘系统效能。 使用RAID目的 加快访问速度 使用一个虚拟磁盘,从而增加存储容量 减少磁盘失效带来不利的影…

    Linux干货 2016-11-22
  • 软件包管理

    1.程序包管理器 源代码–>目标二进制格式–>组织称为一个或有限几个“包”文件;     安装、升级、卸载、查询、校验 程序包管理器: debian(Ubuntu):dpt,工具:dpkg,程序包以“.deb”结尾 redhat:redhat package manager&nbsp…

    Linux干货 2016-08-21
  • 文件查找find和locate

            在Linux这个一切皆文件的系统中怎么能快速和精确的查找到文件,是我们必不可少的技能。而文件查找的命令可以让我们在很短的时间内在文件系统中找到我们要查找的文件。这就是我们要掌握的,因此我来介绍一下文件查找的这两个命令locate和find。 文件查找:在文件系统上…

    Linux干货 2016-08-24