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

相关推荐

  • N22-第一周博客:计算机及Linux系统的入门学习了解

                                  …

    Linux干货 2016-08-15
  • 第1周-1:计算机的组成及其功能以及部分常见Linux发行版简介

    一、计算机的组成及其功能: 计算机主要由硬件部分和软件部分组成。 1、硬件部分 (1)中央处理器 由控制器和运算器两大部分组成,是计算机的大脑,硬件部分里最关键的部分。决定着整个计算机系统的性能。 控制器负责协调计算机硬件的其他部分同步工作,对其他的硬件进行发号施令。是计算机系统的司令。控制器从存储器中读取指令,分析指令的含义,要完成什么操作,需要什么数据,…

    Linux干货 2016-11-01
  • 逻辑卷管理器LVM使用简介

    逻辑卷管理器(LVM) 原理图如下: 先准备一个分区/dev/sdb1,注意也存在ID问题,选择8e。 1.先把磁盘变成物理卷 在做这步前可以先看下系统中存在的物理卷,没有就什么都不会显示。 把我们准备好的两个磁盘变成物理卷,注意我那使用旧的格式化的分区磁盘,可能会出现上面有文件系统或者卷标类型的问题,所以尽量使用新磁盘做实验。如果出现这种情况,可以使用dd…

    2017-05-02
  • 命令组合实战

    1 列出/etc/下以。conf结尾的文件 [redsun@jiange root]$ ls  /etc/*.conf | tr 'a-z' 'A-Z'  | sed 's/ETC/etc/' > /tmp/etc.conf [redsun@jiange root]$ mo…

    Linux干货 2016-11-13
  • 软链接与硬链接

    软链接 硬链接

    2017-11-18
  • 马哥教育网络班22期+第2周课程练习

    1、Linux上文件/目录相关命令有哪些? 1)目录管理类命令:mkdir、rmdir (1)mkdir:make directorise 创建文件夹  使用格式:      mkdir [OPTION]… DIRECTORY…    &nb…

    Linux干货 2016-09-08