sed 是linux命令中用于行数据处理的工具,能处理来自管道或者文件的输入。
语法: sed [选项] ‘[过滤字符][{]处理命令[}]‘,其中 []包围的表示不是强制必写。
- "过滤字符"的格式是/字符串/,‘/‘不能省略
- "处理命令"如果是多个的话用分号";"隔开,用‘{}‘包围,如果有多个处理命令,相当于一个命令集。
1. sed能对行进行处理
- 选项有如下几种常用的:
-n: 安静模式,只输出做过处理的行,否则会重复输出处理的行。安静模式下只有显示的使用p才会输出到屏幕上。
-e: 后面紧接处理命令,一次执行一个,后面还可以继续使用这个选项执行其他命令,避免使用管道或者不能多个命令同时使用的情况
-f: 后面接脚本文件
-r: 在处理命令中使用扩展正则表达式,默认是基础正则表达式
-i: 以文件作为输出,即直接修改文件,而不会输出到到屏幕
-c: 在-i的情况下,使用复制方式而不是直接修改文件的所有关系(ownership),应该就是不会修改文件的owner
2. 处理命令有下面几种(如果不执行以下命令只要在命令前加!,例如‘1!p‘表示第一行不打印,其他命令类似):
p: 打印输出行,语法--> ‘m,np‘,其中m,n是行号,最后一行用$表示,如果是一行则为‘mp‘,如果m,n都没有值则表示当前行。例如第2到7行-->‘2,7p‘,第5到最后 一行-->‘5,$p‘
i: 在某行之前插入内容,语法-->‘mi xxxx‘,其中m为行号,例如在第三行之前插入hello--> ‘3i hello‘
a: 在某行之后插入内容,语法类似i-->‘ma xxxx‘,其中m为行号,例如在第三行之后插入nihao-->‘3a nihao‘
d: 删除某些行,语法--> ‘m,nd‘,其中m,n是行号,类似p中的定义,例如删除2到5行-->‘2,5d‘
s: 替换行中的某些内容,语法--> ‘m,ns/regEx/replace/[g]‘,其中m,n类似p中的定义,regEx是要被替换的内容,可以是正则表达式,replace是要替换的内容,g代 表全部都要处理,如果没有则只是替换从左到右的第一个匹配项
q/Q: 结束处理命令,后面的行将不会再处理。语法‘q‘。
n: 从流中读取下一行到pattern space进行处理,后面的命令将会只会处理下一行。
N: 从流中读取下一行扩展到pattern space一起处理,后面的命令会一起处理当前行和下一行。
w: 把当前的pattern space写入文件,语法-->‘w xxx‘,xxx代表文件名。
W: 把当前的pattern space第一行写入文件,语法-->‘w xxx‘,xxx代表文件名。
注意:sed是以行为单位的流编辑器,所以命令每次都从流里读取一行放到模式空间(Pattern space),处理一行完了就会输出模式空间的内容到屏幕(除非设置安 静模式-n)并清理模式空间,再重复下一行,所以模式空间就像一个临时工作缓存,以行为单位。这里还有一个缓存,叫保留空间(Hold space),这个缓存不会被 清除,可以保存一些想被跨行共享的数据。它俩之间可以相互转存,通过以下命令
h H Copy/append pattern space to hold space. --> 拷贝/扩展 从模式空间到保留空间
g G Copy/append hold space to pattern space. --> 拷贝/扩展 从保留空间到模式空间
x Exchange the contents of the hold and pattern spaces. --> 相互交换内容