sed命令详解与例示



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

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

(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。第二条命令处理120行内匹配以str结尾的行($匹配行尾),并把str更换为newcontent后打印匹配行。

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

sed  ‘s#pattern#newcontent#g' datafile

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

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

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 获取匹配内容的下一行,并将其读入缓冲区进行处理。
sed  ‘/pattern/{n;s/oldstr/newstr/;}’  datafile

该命令匹配 pattern 后,将匹配行后面一行读入缓冲区,然后将该行中匹配 oldstr 的字符串替换为 newstr 。如果是大写的命令N,则会处理当前行,当将当前行之后的一行读入缓冲区(无视匹配条件),连接到当前行后面。

注:如果需要输入多条命令,或者需要在某地址范围内嵌套地址,就必须使用花括号将命令括起来,每行只写一条命令,或者用分号分隔同一行中的多条命令。

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

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

120行内,所有字符串str1234将会被替换为STRAB^$/

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

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

sed  ‘/pattern/{s/pattern/newstr/;q}’  datafile

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

命令 hgHG。在缓冲区,除了为了保存当前待处理行副本而创建的空间(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另还有其它一些选项和命令,这里不再一一赘述。如果需要,可以参考Sed- An Introduction and Tutorial by Bruce Barnett给出的讲解。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值