流编辑器sed
1 sed命令基础
sed是一个行编辑器,它的工作过程是,首先将文件分成以行为单位,然后将每一行逐次的放入缓冲区(模式空间),sed将其处理完毕后发送到标准输出,处理完最后一行sed便运行结束。由于sed是对存储在缓冲区的文件进行编辑,因此,sed不会修改或者损坏正在编辑的文件。
sed命令格式:
sed [option] 'command' filemame
1.1 option
sed的可选参数比较少,主要就是下面这几个。
-e | 允许多项编辑 |
---|---|
-f | 指定sed脚本文件 |
-n | 取消默认的输出 |
1.2 command
不同于grep的pattern,这里command不仅包含了正则表达式所匹配的模式,而且还包含了对匹配进行处理的命令。同时,sed的匹配是以‘/’开头和结尾的,中间包含着对文本的匹配模式,如/less/就是匹配所有以less开头的行。而在匹配之后跟着的是对匹配结果的处理命令,例如/less/d就是将所有以less开始的行删除。命令如下:
d | 删除一行 |
---|---|
i\ | 在当前行插入文本 |
a\ | 在当前行添加一行或者多行 |
p | 打印该行 |
s | 用以个字符串替换另一个 |
g | 全局替换 |
w | 将行写入文件 |
l | 列出非打印字符 |
r | 从文件中读取输入行 |
q | 结束或推出sed |
1.3 filename
sed一般只处理一个文件。
1.4 关于缓冲区和暂存缓冲区的区别
正常情况下,sed将文件以行为单位放入缓冲区,然后按照指令进行操作,最后发送到标准输出。但是,sed拥有一个暂存缓冲区,它可以将缓冲区的内容保存到暂存缓冲区中,等到合适的时候再放入缓冲区。使用它们的命令与hgx,其中,命令h将选中的内容放入暂存缓冲区,g命令将内容发回缓冲区,而x命令则是将缓冲区和暂存区的内容互换。
2 实例
2.1 删除文件中的XX行
~$ sed '1,3d' test 5 File formats and conventions eg /etc/passwd 6 Games 7 Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7) 8 System administration commands (usually only for root) 9 Kernel routines [Non standard] # 删除文件的第一到三行
~$ sed '/calls/d' test 4 Special files (usually found in /dev) 5 File formats and conventions eg /etc/passwd 6 Games 7 Miscellaneous (including macro packages and conventions), e.g. man(7), groff(7) 8 System administration commands (usually only for root) 9 Kernel routines [Non standard] # 删除包含calls的行
2.2 打印文件的XX行
~$ sed -n '1,3p' test 2 System calls (functions provided by the kernel) 3 Library calls (functions within program libraries) 4 Special files (usually found in /dev) # 打印1-3行
~$ sed -n '/calls/p' test 2 System calls (functions provided by the kernel) 3 Library calls (functions within program libraries) # 打印包含calls的行
2.3 替换文件中的XX行
~$ sed -n 's/kernel/hello/p' test 2 System calls (functions provided by the hello) # 将kernel替换为hello
其实关于sed的命令还有很多,但是只要你掌握了基础用法,其它的照着模子就能刻出来。而且sed无非就是grep的升级版,它不仅可以匹配,而且能将匹配的行作出某种修改,但是sed仍有局限。它不能将每一行分成若干单位进行处理,这时候awk就起到作用了,下一节会专门介绍awk实用程序。
3 回顾
3.1 将所有包含Sam的行打印
sed -n '/Sam/p' file
3.2 删除包含Sam的行
sed '/Sam/d' file
3.3 删除从Sam行开始到Tom行结束之间所有的行
sed '/Sam/,/Tom/d' file
3.4 删除第1行到第5行之间所有的行
sed '1,5d' file
3.5 删除所有不包含Sam的行
sed '/Sam/!d' file
3.6 将包含Sam行的love改成hate
sed '/Sam/s/love/hate/g' file
3.7 删除每行前4个字符
sed 's/....//' file
3.8 删除每行后三个字符
sed 's/...$//' file
3.9 将所有包含Sam的行写入new文件中
sed -n '/Sam/w new' file
3.10 将所有的包含functions的行替换成funchello
sed 's/\(func\)tions/\1hello/' file
4 总结
sed作为一个行为单位进行编辑的工具,使得其可以编辑相当大的文件,不会存在像vi那样打不开文件的情况;除此之外,sed在对文件进行编辑的过程中,并不会破坏源文件,因此可以放心的使用。