sed是UNIX下非常重要的文本处理工具,是stream editor(流编辑器)的缩写。这个命令配合正则表达式能够处理非常强大的文本操作功能。其中众所周知的用法就是文本替换。
1.概览
sed [option] 'script'/scriptfile inputfile
sed可以替换给定文本中的字符串,利用正则表达式进行匹配。
2.实例特性
1.基本替换
$ sed 's/pattern/replace_string' inputfile
2.原文件替换
使用-i选项,可以将替换结果应用于原文件,有很多使用替换后进行重定向的方式来进行,其实可以直接使用这个选项一步到位。
sed -i 's/text/replace' inputfile
3.全局替换
默认情况下,sed只会每次读取文件的一行,然后找到匹配的第一处内容,然后进行替换。如果需要替换所有匹配的内容,那么需要使用g选项。
sed 's/pattern/replace/g' inputfile
$ echo "this thisthisthis" | sed 's/this/THIS/g'
THIS THISTHISTHIS
如果需要指定从匹配的第N处开始替换,可以使用如下的方式进行:
sed 's/pattern/replace/3g' inputfile
$ echo "this thisthisthis" | sed 's/this/THIS/2g'
this THISTHISTHIS
4.其他
-f选项可以使用一个脚本文件来进行替换,-r选项可以指定使用扩展的正则表达式,-s使用多个文件时,每个文件视为单独文件而不是一个整体文件。-u不使用文本流的缓冲。-z使用空白字符来分割每一行。
3.扩展
1.移除空白行
正则表达式后的d选项用来指定删除匹配的内容。
$ sed '/^$/d' file
2.已匹配字符串标记
在sed中,使用&标记已经匹配到的字符串,这样可以在替换字符串中使用已匹配到的内容。
$ echo "this is an example" | sed 's/\w\+/[&]/g'
[this] [is] [an] [example]
3.匹配分组
使用正则表达式时,可以进行分组,其中&代表整个匹配到的字符串,\n代表第n个分组匹配到的字符串。
$ echo "this is digit 1" | sed 's/digit \(\d\)/\1/'
this is 1
4.组合多个表达式
$ sed 'expr1' | sed 'expr2' 等价于
$ sed 'expr1; expr2'
另外,sed表达式通常使用单引号,如果使用双引号,会对表达式里面的变量进行求值。