本文主要参考《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停止读取新的输入行,并停止将它们发送到输出。