红联Linux门户
Linux帮助

sed命令详解与示例

发布时间:2014-11-13 11:14:20来源:linux网站作者:linux人

grep命令的查找功能,sed命令的流编辑功能和awk(现已发展成为一门编程语言)作为更强大的文本编辑命令,在Linux系统管理中,起着重要且全面的作用。而后来出现的perl编程语言(PracticalExtraction and Report Language),可以实现sed和awk的几乎所有功能。但使用perl相对复杂和臃肿,因而sed和awk仍然活跃在shell编程的各个方面。


(1) sed是非交互式的编辑器,它按行处理对象文件,但不修改处理文件本身,而是逐行读入文件内容并在临时缓存区保存副本并对其进行处理。处理完成每一行就将该行目标内容打印到屏幕,并将该缓存区内容删除,然后读入下一行进行处理。另外需要注意的是,和grep不同,sed不论是否知道指定的模式,它的退出状态都是0(Linux中通常代表真)。只有存在语法错误时,sed的退出状态才不是0。

sed命令的一般格式为

sed [option]    ‘{ command}’  datafile

或者

sed [option]  -f    sed_script.sh    data_file

如果没有输入文件,则sed将从标准输入中接收输入流。


(2)常用的sed option

-n取消默认输出。sed命令默认打印输入文件的所有行的同时,再次打印匹配行内容。加上-n命令后,则只打印匹配命令中指明的pattern的行。

-e指定多个编辑命令。sed默认之接受一组命令,如果要指定多个命令,则需要使用-e选项指明各个命令。例如

sed -n -e '1,800{/pattern/p}'  -e  '1,800{/parttern/=}'  datafile

该命令使用-e指定两个命令。前一个打印匹配pattern的行,后一个打印匹配pattern的行的行号。1, 800是定址条件,指明只查询处理1到800行的数据。


(3)sed命令

命令p用于显示sed处理的内容,常和-n选项一起使用,以取消默认打印操作,只打印选定内容。

命令d用于删除匹配行。注意删除的是缓冲区副本而非文件本身。

sed ‘$d’ datafile
sed ‘/pattern/d’ datafile

第一条命令删除文件的最后一行($匹配最后一行),打印文件的所有其它内容。第二条命令删除匹配pattern的行,并打印其它所有行。
命令s用于替换指定内容。

sed ‘s/pattern/newconent/g’ datafile
sed  –n ‘1,20s/str$/newconent/gp’ datafile

第一条命令全局替换(g)文件中符合pattern的字符串为newconent。第二条命令处理1到20行内匹配以str结尾的行($匹配行尾),并把str更换为newcontent后打印匹配行。

上述例示中都以 / 作为匹配串和新字符串的分隔符,但实际上,可以指定其它分隔符(换行符、反斜杠除外)。指定其它分隔符时,可使用类似如下方式。

sed  ‘s#pattern#newcontent#g' datafile

上述命令指定#为分隔符。

命令 r 为读命令,使用该命令将另一个文本文件的内容加到当前文件的特定位置上读出。

sed  ‘/pattern/r input.txt’  datafile

如果在文件datafile的某一行匹配到pattern,就在该行后读入文件input.txt的内容。该过程为全局型行为。

命令w为写命令,将当前文件的内容写入到另一个文件中。

sed  ‘/pattern/w output.txt’  datafile

该命令读取datafile中匹配pattern的行并写入到output.txt中保存。
命令 a\是追加命令。执行该命令,将追加输入内容到当前文件当前行的后面读出。输入内容位于需要另起一行。如果输入内容超过一行,则除最后一行外,每一行都应以 \  结尾。

sed  ‘/pattern/a\
>some text part 1\
>some text part 2’ datafile

如果在文件datafile中发现匹配pattern的行,则在该行下面追加some text part1 some text part2内容后打印。原文件datafile并不会改变。

命令 i\和a\类似,不过该命令在匹配行前面追加输入字符串打印。

命令 c\和前两个命令类似,它用输入字符串替代当前文件当前行的内容。

sed  ‘/pattern/c\newstr’  datafile

命令 n获取匹配内容的下一行,并将其读入缓冲区进行处理。[plain] view

sed  ‘/pattern/{n;s/oldstr/newstr/;}’  datafile

该命令匹配pattern后,将匹配行后面一行读入缓冲区,然后将该行中匹配oldstr的字符串替换为newstr。。如果是大写的命令N,则会处理当前行,当将当前行之后的一行读入缓冲区(无视匹配条件),连接到当前行后面。
注:如果需要输入多条命令,或者需要在某地址范围内嵌套地址,就必须使用花括号将命令括起来,每行只写一条命令,或者用分号分隔同一行中的多条命令。

命令 y逐字符以一对一的方式自左向右替换。

sed  ‘1,20y/str1234/STRAB^$/’  datafile

将1到20行内,所有字符串str1234将会被替换为STRAB^$/。

注:正则表达式的元字符在y命令后将失去其作用。

命令 q将导致sed程序退出,不再进行其它处理。

sed  ‘/pattern/{s/pattern/newstr/;q}’  datafile
在文件中匹配pattern的行进行替换后,直接退出,不继续任何其它操作。需要的注意到是,q可以限定某行,但不能限定从第m行到第n行。

命令 h、g、H和G。在缓冲区,除了为了保存当前待处理行副本而创建的空间(patternspace,模式空间),sed会另外开创一个空间(hold space)用于满足用户和模式空间交互的需求。一般地,patternspace内容由sed自动管理:每次读入一行,处理完成后将处理后内容传送到标准输出,然后删除模式空间内容读入下一行。

使用h命令,清空holdspace内容后,将当前pattern space内容复制到hold space。

使用H命令,将当前将当前patternspace内容追加到hold space内容后(换行追加)。

使用g命令,清空patternspace内容后。将当前hold space内容复制到 patternspace。

使用G命令,将当前将当前hold space内容追加到pattern space内容后(换行追加)。


(4)sed脚本

sed脚本就是写在文件中的sed命令群。脚本中,每行命令的末尾不能有任何多余的空格或文本。如果在一行中有多个命令,要用分号分隔。执行脚本时,sed先将输入文件中第一行复制到模式空间,然后对其执行脚本中所有的命令。每一行处理完毕后,sed再复制文件中下一行到模式空间,对其执行脚本中所有命令。使用sed脚本时,不再用引号来确保sed命令不被shell解释。

#sed –f sed_script datafile
3i\
Some_text_to_insert
3,$s/\(pattern1\) is \(pattern2 \)/\2 is \1/
$a\
Some text to print!

然后可以执行sed命令

sed  -f sed_script datafile

sed命令在第3行前插入Some_text_to_insert。然后匹配从第3行到最后一行之间的pattern1ispattern2字符串,并用 pattern2 is pattern1将其替换。最后在最后一行后添加一行Some text to print!


sed另还有其它一些选项和命令,这里不再一一赘述。