Fork me on GitHub

sed初级教程

简介

sed是作为特殊目的的编辑器而创建的,用于专门执行脚本;与ed不同,它不能交互地使用。sed面向字符流。默认情况下,到sed的所有输入都会经过相应的处理,并转为标

准输出。输入文件本身不发生改变。如果确实想改变输入文件,一般使用shell机制进行输出重定向,当你对所做的编辑工作满意时,用修改后的版本代替最初的文件。

sed的字符流定位对如何应用寻址有重要影响。sed遍历文件,每次一行,这样每一行都成为当前行,而且每一行都应用相同的命令。

sed命令是隐式的全局命令

sed中s/regular/complex/   等价于  ed中  g/regular/s//complex/

理解ed中的当前行寻址与sed中全局行寻址之间的区别是很重要的。在ed中,使用寻址扩大受命令影响的行数;在sed中,使用寻址限制受命令影响的行数。

模式空间

sed维护一种模式空间,即一个工作区或临时缓冲区,当应用编辑命令时将在那里存储单个输入行。下图展示了进行模式空间转换的一个两行的脚本。它将“TheUnix System”改变为“The UNIX Operating System"。一次一行设计的一个优点是sed在读取非常庞大的文件时不会出现问题。屏幕编辑程序必须将整个文件(或者它的一些庞大的部分)读入内存,这将会产生内存溢出或者在处理虎大的文件时速度非常慢。

模式空间的内容是动态的,而且并不总是匹配最初的输入行。

模式空间的操作

  1. 生成输入行的备份。
  2. 修改模式空间中的备份。
  3. 将备份输出到标准输出。

使用sed

调用sed有两种方法:在命令行上指定编辑指令,或者将它们放到一个文件中并提供这个文件的名字。

测试文本:list

John Daggett, 341 King Road, Plymouth MA
Alice Ford, 22 East Broadway, Richmond VA
Orville Thomas, 11345 Oak Bridge Road, Tulsa OK
Terry Kalkas, 402 Lans Road, Beaver Falls PA
Eric Adams, 20 Post Road, Sudbury MA
Hubert Sims, 328A Brook Road, Roanoke VA
Amy Wilde, 334 Bayshore Pkwy, Mountain View CA
Sal Carpenter, 73 6th Street, Boston MA
View Code

命令行上指定命令

3种方式指定多行指令

用分号分割指令

每个命令前面加-e

sed -e 's/MA/Massachusetts/' -e 's/ PA/, Pennsylvania/' list

效果同beyond compare对比图

利用Bash分行指令功能

[root@localhost learn_sed]# sed '
> s/MA/Massachusetts/
> s/ PA/, Pennsylvania/' list
View Code

效果同beyond compare对比图

阻止未命中输入行显示

上面输出结果,那些未命中的行业显示了。-n可以组织sed输出,但是他把命中的行也阻止了。所以,对于想要输出的行必须包含p

sed -n 's/MA/Massachusetts/p;s/ PA/, Pennsylvania/p' list

提供脚本文件

sed脚本文件,sedsrc

s/MA/Massachusetts/
s/ PA/, Pennsylvania/
View Code

-f 指定命令行上的脚本文件名字

sed -f sedsrc list 

输出结果对比见beyond compare对比图。

显示在屏幕上的结果是临时的,输入文件中没有发生改变。要先保存输出结果,必须重定向

sed -f sedscr list > newlist

千万注意,list和newlist不能是同一个文件。

 

posted @ 2018-12-06 19:12  克拉默与矩阵  阅读(247)  评论(0编辑  收藏  举报