一、sed命令简介
sed(StreamEditor)是一个“非交互式的”面向字符流的编辑器,能同时处理多个文件多行的内容。处理时,把当前处理的行存储在临时缓冲区中,接着用sed命令处理,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。并且源文件内容没有改变,除非你使用重定向存储输出。其功能非常强大,更是编写shell脚本必会的命令之一。
二、sed命令基本使用
对行的操作:
基础就是查找到这一行(寻址方式),然后才能操作这一行。在sed中有两种方式来进行行寻址:
- 以数字形式表示行区间
- 用文本模式来过滤输出行
1、替换
命令格式如下:
sed '[address]s/old/new/flag' file
其中sed后的命令需要用单引号'括起来,最后的file表示的是对这个文件进行的操作。方括号[ ]中的address表示寻址方式,是个可选的选项。有四种可用的替换标记(flag位):
- 数字,表示新文本替换第几处的old文本
- g,新文本会替换所有匹配的
- p,原先行的内容要打印出来
- w file,将替换的结果写入文件
下面我们做一个简单的演示,方便理解,我们先创建如下这样一个文件:
然后进行一个基本的替换操作:
很容易看见,1111被成功的替换成了new1111。注意,接着执行cat后,发现源文件并没有变,只是在流中操作而已,如果需要保存,需要使用重定向。
如果我们需要修改某一行中的一个字符,一直到最后一行,应该怎么办呢?可以使用$符号,来代表最后一行,见如下示例:
如果,我们仅需要修改第二行呢?那么在address选项中可以用字符甚至正则表达式来模糊匹配:
我们发现,它自动定位到了第二行,然后替换了我们要改的字符。我们可以构造更复杂的正则表达式来匹配和提取复杂的文本,以便完成很多高级操作。
记住:这里定位行的方法,在大多数操作里面都是可以用的。如果是数字定位行,直接写数字就可以了:如2s(替换第二行)、2,8s(替换第2到8行);如果是字符模式,则需要用正斜杠/将其包裹起来,如/demo/s(替换含有demo字符串的行)。
2、增加
对于增加行的操作,有两个关键字i和a,即i是在行前插入,a是在行后附加一行。命令格式如下:
sed '[address]i|a\string' file
表示的是对file文件进行操作,将string加到响应的位置。注意,这里是反斜杠 \。
还是用前面的例子,我们在第一和二行前面加上一个新行,可以用如下操作:
同样,增加行的操作也是支持模式寻址方式的;
3、删除
删除操作的关键字是d,它的命令就更简单了:
sed '[address]d' file
意思也很直观,就是删除file文件中,匹配到的行。
4、修改
修改行的关键字为c,命令格式为:
sed '[address]c\new string' file
注意这里是反斜杠。即对file文件中匹配到的行进行修改操作。
这里要特别注意的是,
如果使用地址区间,会将此区间替换成new string,而非对每一行进行替换!
对字符的操作:
sed中对字符的操作,用的是转换命令,关键字为y,是唯一一个可以处理单个字符的sed编辑器命令。格式如下:
sed '[address]y/oldchar/newchar/' file
特别注意这里的oldchar和newchar位数必须相同,运行命令后,确定操作的行后,会逐个对应字符,去替换。
观察下图可以发现,进行的操作即是,精第二行所有的小写n,换位大写N。
处理文件:
sed处理文件,可分为读和写文件。w命令向文件中写入行,r命令从文件中读出数据再向数据流中插入或附加文本。
sed '[address]w file1' file2
sed '[address]r file1' file2
意思分别为:w-将file2中匹配到的行,写入到file1;r-将file1中的所有行,读取并输出到file2。
请看如下
write操作示例,先创建两个文件如下:
从上图可以看到,执行sed的write操作时,输出的时file2文件中的内容,然而当我们查看写入的file1时发现操作已经完成了,因此使用此命令要特别小心,不要覆盖了有用的文档!
而进行
read操作时,会读取file1中的所有行,将其输出到file2中用address定位的地方。不会改变两个源文件,因此要保存的话可以使用重定向。
同样,可以使用模式匹配来确定行,不再赘述。
我们也可以使用组合命令来完成替换等操作,如下,使用r和d,来替换一段文本:
三、其他
- p命令打印文本
- =打印行号
这连个命令可以用来打印数据流中的信息:(使用-n不产生命令输出,使用print命令来完成输出)
我们同时使用p和=命令,就可以打出特定文本出现的行号了。
通过以上的命令,我们就可以使用sed来完成一些基本的文件操作了,正确的使用正则表达式定制过滤器是使用sed提取和处理文件的关键,sed还有很多强大的功能还需要去学习和使用。