Linux sed命令(一)基础

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011436666/article/details/72904388

一、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还有很多强大的功能还需要去学习和使用。

猜你喜欢

转载自blog.csdn.net/u011436666/article/details/72904388
今日推荐