grep命令的查找功能,sed命令的流编辑功能和awk(现已发展成为一门编程语言)作为更强大的文本编辑命令,在Linux系统管理中,起着重要且全面的作用。而后来出现的perl编程语言(PracticalExtraction and Report Language),可以实现sed和awk的几乎所有功能。但使用perl相对复杂和臃肿,因而sed和awk仍然活跃在shell编程的各个方面。
在sed命令中引入shell变量
Linux下Shell编程——sed命令基本用法
(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为写命令,将当前文件的内容写入到另一个文件中。