流编辑器Sed(Stream Edit)详解

流编辑器Sed(Stream Edit)详解

 

    Grep 、sed 和awk并称为文本三剑客。使用Grep就可以很好的实现文本查找的功能,而且简单有效。然而其却无法直接对其进行编辑,sed的出现便解决了这一问题。

Sed被称为流编辑器,它是一种新型的非交互式的文本编辑器,它逐行处理文件或输入,并将结果输出到屏幕上。Sed编辑没有破坏性,它默认不会修改文件,除非使用选项主动修改。如果需要进行多项编辑任务,也可以把命令写在一个叫sed脚本的文件里。

 

Sed的工作原理

Sed从文件开头逐行处理文件或输入,并将结果输出到屏幕上。Sed 将当前处理的行放在一个叫模式空间的临时缓存区,在对其进行sed命令编辑后,就将结果输出到屏幕上(除非sed命令删除这一行或取消打印)。Sed每处理完一行就将其从模式空间中删掉,然后将下一行读入空间,进行处理和显示。处理完文件的最后一行后,sed便结束运行。

流编辑器Sed(Stream Edit)详解 

sed之正则表达式

与grep一样,sed在文件中查找模式时也要使用正则表达式和各种元字符。正则表达式是括在括在斜杆间的模式,用于查找和替换。

流编辑器Sed(Stream Edit)详解 

如果要把正则表达式分隔符改成其他字符如c,只要在这个字符前加一个反斜杆,在字符后跟上正则表达式,再跟上这个字符即可,如:

流编辑器Sed(Stream Edit)详解 

说明,如果斜杆本身是正则表达式的一部分,则需在其前加上反斜杆,以免和作用分隔符的斜杆混淆;或者使用如上方法将分隔符改成其他字符;如:

流编辑器Sed(Stream Edit)详解 

流编辑器Sed(Stream Edit)详解 

 

地址定界

地址定界用于决定对那些行进行编辑,地址的形式可以是数字、正则表达式或二者的结合。如果没有指定地址,sed 将处理文件中的所有行。定界方法(#代表数字):

无地址

对全文进行处理

#

指定的第#行

$

代表最后一行

/PATTERN/

被此处模式所能够匹配到的每一行

#1,#2

从#1行到#2行

#1,+#2

从第#1行向下共#2行

/PAT1/,/PAT2/

从第一个被PATTERN1匹配到的行开始到第 一个被PATTERN2匹配到的行及之间的所有行

#,/PATTERN/

从第#行开始到第一个能够PATTERN匹配到的行的所有行

~

步进;    eg. 1~2:奇数行; 2~2:偶数行        

 

Sed用法

Sed命令的格式为:sed [OPTION]… {script-only-if-no-other-script} [input-file]…

其中脚本又由地址定界加编辑命令组成,地址定界指明对文件中的哪些行做编辑。编辑命令则说明做什么编辑操作,如增、删、显示。

常用选项

-n

取消默认输出

-e

允许多项编辑

-f FILE

从指定文件FILE中读取编辑脚本

-r

支持使用扩展正则表达式

-i[SUIFFIX]

直接编辑原文件,后缀SUFFIX若指明则添加此后缀备份

编辑命令

Sed命令告诉sed如何处理由地址界定指定的各输入行,如果没有指定地址,sed就会处理所有的行。Sed命令有:

p

显示所匹配到的所有行

d

删除所匹配到的行

i \TEXT

在匹配到的行前面追加新行,内容为TEXT,可使用\n追加多行内容

a\TEXT

在匹配到的行后面追加新行,内容为TEXT,可使用\n追加多行内容

c\TEXT

用新文本TEXT替换匹配到的行

w

将匹配到的行保存至指定文件中;w /PATH/TO/SOMEFILE

r

将指定的文件内容追加至匹配到的行后面;r /PATH/TO/SOMEFILE

=

在匹配到的行前面显示行号,行号单独占据一行

!

取反;    eg. 地址定界!编辑命令

q

退出

s

查找并替换,s/PATTERN/STRING/修饰符,模式可用RE,其分隔符可自定义,例如s@@@,s###等等(换行符,反斜线除外)。

    STRING:使用字符串定义替换的内容,可使用后向引用\1,\2,…;

    &:sed支持的元字符之一,引用前面PATTERN所匹配到的所有内容

替换标志

p:显示替换成功的内容;

w /PATH/TO/SOMFILE:将替换成功的内容保存至指定文件当中;

i:查找替换时忽略大小写;

g:全局替换,默认只替换每行第一个被PATTERN所匹配到的内容;

y:将字符替换为另一字符。

如果要使用多条命令,或者需要在某个地址范围内嵌套地址,就必须用花括号括起来,每行只写一个命令;或者用分号分隔一行中的多个命令。

流编辑器Sed(Stream Edit)详解 

1到5行中包行etc的替换成大写的ETC,然后把第4行删除。用-e选项也可实现同样的效果。

流编辑器Sed(Stream Edit)详解 

第1至5行先删除第3行再显示。

Sed范例

下面以/etc/fstab/文件为例,对sed命令做示范

流编辑器Sed(Stream Edit)详解 

1、打印:p命令

命令p是打印,用于显示模式空间中的内容。默认情况下,sed会把输入行打印在屏幕上,选项-n可以取消默认打印。因此但选项-n与p命令同时出现时,sed可打印选定的内容。

流编辑器Sed(Stream Edit)详解 

只打印1到3行

2、多重编辑:-e选项

流编辑器Sed(Stream Edit)详解 

-e用于进行多重编辑。第一重删除1-3行,第二重将行首为UUID的行的改成小写的uuid。因为是逐行进行这两项编辑,所以编辑的命令顺序可能会影响结果。

3、插入:i命令

流编辑器Sed(Stream Edit)详解 

在含etc的行下加如hello sed,\n表示换行;也可斜杆回车如下图:blob.png

4、读文件:r命令

流编辑器Sed(Stream Edit)详解 

在第1行下读入文件/etc/issue的内容

5、否定命令:!

流编辑器Sed(Stream Edit)详解 

不删除包含etc的行。

6、替换:s命令

流编辑器Sed(Stream Edit)详解 

将所有包含0的行的所有0改成A,并且加g命令全局替换,不加g命令则只替换行里第一个0。

7、退出命令:q

退出命令表示退出,此命令将导致sed程序退出。

流编辑器Sed(Stream Edit)详解 

打印完第五行后,q命令让sed退出。

Sed高级命令

Sed执行时逐行将文件内容读至模式空间,进行编辑后再输出。然后删除模式空间,读入下一条,这样直至最后一条。但是其实sed还有一个特殊的缓存空间叫保持空间或暂存缓冲区(holding buffer),使用h/H命令可以将模式空间中的内容复制并保存在保持空间,使用共g/G则可以将保持空间中内容放回模式空间,覆盖,或追加模式空间当前行的后面。这样便有了sed的一些高级的使用方法。其命令为:

h

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

H

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

g

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

G

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

n

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

N

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

d

删除模式空间中的行,开始下一循环

D

若模式空间无多行则同d;若有,则删除模式空间所有行,并以此时的模式空间开始下一循环

x

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

例:

流编辑器Sed(Stream Edit)详解 

当读入到包含etc的行时(第3行),将其放入保持空间,并删除模式空间的内容;当再读到包含dev的行时将保持空间中的内容即第3行放入模式空间后面。最后实现将第3行放到组后一行后面。

Sed的高级命令其实还有很多用法,如:

1、sed -n ‘n;p’FILE            显示偶数行

2、sed ‘1!G;h;$!d’FILE       文件逆序显示

3、sed  ‘$!N;$!D’FILE        显示文件的最后两行

4、sed  ‘$!d’FILE               打印最后一行

5、sed  ‘G’FILE                   每行后加一行空行

6、sed ‘g’FILE                    每一行换成空白行

7、sed  ‘/^$/d;G’FILE        把空白行删除,并把每行后加一空白行

8、sed ‘n;d’FILE                 打印数行

9、sed -n ‘1!G;h;$p’FILE    逆序打印

 

Sed脚本编程

Sed脚本就是放在文件中的一列sed命令,使用选项-f后加文件名读取脚本文件。Sed脚本中命令格式要求很特别。他要求命令的末尾不能有任何多余的空格或文本。如不命令不能独占一行,则必须以分号结尾。不能使用引号,除非它是被查找的字符串的一部分。使用反斜杆即可实现换行。

执行脚本时,sed先将输入文件中的第一行读入模式空间,然后对其执行脚本中的所有命令。每行处理完毕再读下一行直至最后一行。如果脚本语法有错误,sed脚本就会运行错误。范例:

流编辑器Sed(Stream Edit)详解 

Sed脚本:1如果有包含etc的行则在其下加入文字”this is a…”;2在所有UUID开头的行下面加一行空白行;3删除最后一行。

流编辑器Sed(Stream Edit)详解 

执行结果

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

(0)
beyondbeyond
上一篇 2016-08-22 08:44
下一篇 2016-08-22 08:44

相关推荐

  • N21_第x周_Storm_01_单机实践篇

       这2周没有按马哥安排的课程走,因公司需要,大家一直在试尝大数据这块。作业不能不做,也不知道马哥哪周的作业会有storm,只好先将这段时间的实验慢慢记录下来(其它flume、kafka、spark等本周会慢慢补充),等知道具体的作业题目后,再完善。 实验目的   了解storm的原理,并用storm单机版实验加深理解,为后面…

    Linux干货 2016-09-15
  • find命令总结

    用途:     find命令用来在文件层级结构中搜索跟条件匹配的文件 语法:     find [OPTIONS] [查找起始路径] [查找条件] [处理动作]     查找起始路径:指定具体搜索起始路径。默认为当前目录  &nb…

    Linux干货 2016-09-19
  • 安装CentOS 6.9与CentOS7.3

    今天学习了如何安装CentOS6.9与CentOS7.3. 安装CentOS6.9 首先打开虚拟机如下如所示: 然后点击创建新的虚拟机: 选择典型,然后点击下一步: 一般会选择稍后安装操作系统,然后点击下一步 客户机操作系统有很多,因为今天只安装CentOS 所以选择Linux 版本则选择CentOS 64 位 (因为CentOS7以上没有32位版本,只有C…

    2017-07-14
  • httpd 基础

      http(1) 开启httpd服务,注意selinux 和防火墙设置。出现错误查看系统日志和http错误日志。 进程间通信:IPC socket:套接字 IP:PORT Client <–> Server     Server: listen  &nb…

    Linux干货 2016-11-01
  • 马哥教育网络班21期+第8周课程练习

    1、请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别。 集线器 集线器也称HUB,工作在OSI七层结构的第一层物理层,属于共享型设备,接收数据广播发出,在局域网内一般都是星型连接拓扑结构,每台工作站都连接到集线器上。 由于集线器的带宽共享特性导致网络利用效率极低,一般在大中型的网络中不会使用到集线器。 网桥 网桥(Bridge)也称桥…

    Linux干货 2016-09-01
  • 一次简单的内核编译(二)

      前言:     此次编译是继一次简单的内核编译(一)进行操作编译的,请先查看第一篇再来看此片文章 一、使用busybox代替自己制作的init脚本,实现内核启动;  1、在这里我们使用静态编译busybox,所以需要先安装glibc-static依赖包,如果不安装会报错     2、解…

    Linux干货 2015-06-01