浅析Linux命令之sed
sed:Stream Editor,流编辑器
1、功能
sed用途非常广泛,主要用来自动编辑一个或者多个文件,以简化对文件的反复操作,可用于:
- 文本替换
- 选择性的输出文本文件
- 从文本文件的某处开始编辑
- 无交互式地对文本文件进行编辑等
2、工作方式
sed一次处理一行内容,对一行的操作遵循下面的三个阶段:
- 读取:sed从输入流(文件、管道或者标准输入)中读取一行并且存储到它的临时缓冲区中,称为“模式空间”(pattern space);
- 执行:默认情况下,所有的sed命令都在 模式空间 中顺序执行,除非指定了行的地址,否则sed命令将会在所有行上依次执行;
- 显示:发送经sed命令修改后的内容到输出流。在发送数据之后,模式空间将会被清空。
- 在文件的所有内容被处理完之前,上述过程将会被重复执行。
3、命令格式
sed可以用两种方式调用:
sed [-n] [-e] 'commands' files
sed [-n] -f scriptfile files (例4)
1)第一种在命令行中使用单引号指定要执行的命令commands
2)第二种指定了包含sed命令的脚本文件
4、常用可选项
-n:默认情况下,模式空间中的内容在处理完成后将会打印到标准输出,该选项阻止该行为,只打印模式匹配的行
-e:指定要执行的命令,使用该参数,我们可以指定多个命令
-f:指定包含要执行的命令的脚本文件
5、常用命令
6、行寻址
默认情况下,在sed中使用的命令会作用于文本数据的所有行。如果只想将命令作用于某些特定的行,则需要使用行寻址。sed包含两种方式的行寻址:
1)以数字形式表示的行区间:
例如打印f文件的第3行:p是print打印
sed -n '3p' f
打印文件f的第2到5行(逗号,分隔输出的范围):
sed -n '2,5 p' f
打印文件f的第一行($表示文件的最后一行):
sed -n '$ p' f
打印文件f的第3行到最后一行:
sed -n '3,$ p' f
打印文件的第二行,以及后面的3行(即第2到5行)(M,+n 表示从第M行以及下面n行):
sed -n '2,+3 p' f
打印文件的奇数行(m~n表示应该处理m行开始的每n行,例如50~5匹配行号50,55,60,65等):
sed -n '1~2 p' f
2)以文本模式来过滤行:
格式 /pattern/command
必须用正斜线将要指定的pattern封起来,sed编辑器会将该命令作用到包含指定文本模式的行上。
例如:输出所有包含test的行:
sed -n '/test/ p' f
使用逗号,指定匹配多个匹配的模式,例如输出hello和bye之间的所有行:
sed -n '/hello/, /bye/ p' f
输出第一次出现test的行及其后面3行(结合数字寻址):
sed -n '/test/, +3 p' f
7、示例
我们以f文件为示例:
1)sed '' f #效果等同于cat f
2)sed -n '' f #什么也不显示
3)sed -e '1d' -e '2d' -e '5d' f #
注意此时屏幕输出的已经删除了第1,2,5行,但是并不改变f文件
4)使用echo -e "1d\n2d\n5d\n" > commands #在commands文件中写入1d\n2d\5d
然后执行sed -f commands f,可达到与例3)相同的结果:
参考:http://blog.jobbole.com/109088/