首页 > 代码库 > shell脚本编程学习笔记(3)sed命令的使用

shell脚本编程学习笔记(3)sed命令的使用

本文主要参考《sed&awk》。


我们平时使用的编辑器,比如vi,是交互式的编辑器,就是想修改哪个地方,就先定位到哪个地方,通常通过移动光标来完成。而sed是一个非交互式的面向字符流的编辑器,或者叫流编辑器。sed直接处理输入流并将结果送到标准输出。sed通过解释脚本来工作,该脚本指定了将要执行的动作。


sed每次从输入文件中读取一个输入行,生成该输入行的备份,并且对改备份执行脚本中指定的指令操作。因此,对输入行所做的改动不会影响到真正的输入行。并且,sed的工作模式,是每次处理输入流中的一行。假设有一个sed脚本,名为scriptfile,我们可以通过 sed -f scriptfile inputfile 来执行。执行过程是,读入输入文件inputfile中的第一行,scriptfile脚本文件中的每一条语句对该行进行处理后,再读入第二行,知道结束。这是sed的工作过程。


sed的简单应用举例:

sed   ‘s/ MA/,Massachusetts/‘   list

该指令的意思是将list文件中的MA替换为,Massachusetts,如果要指定多重指令,可以用-e,比如

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

或者用分号隔开

sed    ‘s/ MA/,Massachusetts/  ; s/  PA/,Pennsylvania/‘  list


指令sed -n -e  ‘s/ MA/,Massachusetts/‘   list的意思是该行不输出显示,这就是-n的作用:组织输入行的自动输出。


sed主要有这三个命令行选项:

-e 表示编辑随后的指令

-f  表示跟随脚本的文件名

-n 表示组织输入行的自动输出。


基本的sed命令


语法格式:[address]command

address表示行地址,它可以是行号,正则表达式匹配的行等。后面的command就是sed指令了。

也可以用大括号对多个指令进行分组,使得多个指令作用于同一行,格式如下:

address{

                command1

                command2

                command3

}


注释

和shell一样,注释用#


替换

[address] s/pattern/replacement/flags

意思是对address行中与pattern匹配的部分替换成replacement。

其中,flags有几种取值:

n  1到512之间的一个数字,表示对本模式中指定模式第n次出现的情况进行替换。

g  对模式空间的所有出现的情况进行全局更改,而默认情况下只是替换第一次出现的情况。

p  打印模式空间的内容

w file   将模式空间中的内容写到file文件。


删除  d

比如删除空行:  /^$/d

d前面的就是我们所说的adress部分,表示这些行,这里是指空行,d将这些行删除。


追加、插入和更改

[address]a\

  text


[address]i\

  text


[address]c\

  text

插入命令将所提供的文本text放置在模式空间的当前行之前,追加命令将文本放置在当前行之后,更改命令用所提供的文本取代模式空间的内容。


列表

列表命令为l,用于显示模式空间的内容,将非打印的字符显示为两个数字的ASCII代码。


转换

[address] y/abc/xyz

该命令将字符串abc中的每个字符转换为字符串xyz中的等价字符。


退出命令

q

该命令使得sed停止读取新的输入行,并停止将它们发送到输出。





shell脚本编程学习笔记(3)sed命令的使用