红联Linux门户
Linux帮助

sed命令用法详解

发布时间:2014-09-11 10:11:55来源:linux网站作者:xinghuiru

sed简介
stream editor 流式编辑器(行编辑器),一次读取一行,处理一行;所有操作是在模式空间中进行,根据需要再做处理


基本格式
sed [OPTION]... {模式or /正则表达式/}[command] [input-file]...
即理解为sed 通过一些option(选项) 对特定文件(input-file)通过指定的模式匹配后的结果,再用sed的子命令command处理,得到最终的结果


说明:
1、若没有特别说明,则以下所有的例子都不对源文件进行操作
2、sed后面的内容使用单引号  或 双引号(当有变量需要引用时)
3、正则表达式的使用,默认的为基本的正则表达式

    
options:
-r 使用扩展正则表达式
-i 直接操作源文件
-e 同时处理多个操作
-n 表示在模式空间中的文本不显示,只显示处理之后的内容


command(所有以下的命令都可以取反即使用"!")
d  删除指定的行
例如:删除/etc/fstab的前两行           eg:sed '1,2d' /etc/fstab
删掉除了前两行的内容                     eg:sed '1,2!d' /etc/fstab

p:显示指定的内容(但会显示两边符合条件的内容,因为模式空间中的文本在处理   之前,每一次都会先显示)
例如:显示/etc/fstab中的前两行内容
eg: sed '1,2p' /etc/fstab  前两行会显示两次
eg: sed -n '1,2p' /etc/fstab  只显示了前两行

a\:在模式匹配到的行后面添加新内容
例如:对/etc/fstab中以#号开头的行后面加一行为this is a new line 
eg:sed '/#/a\this is a new line' /etc/fstab


文件test的内容如下:
He love his love.
She like her like.
Dove love her like.

i\:在模式匹配到的行前面添加新内容
例如:对文件/etc/fstab以#号开头的行前面加一行为this is a new line 
eg:sed '/#/r\this is a new line' /etc/fstab
\n可以实现多行添加   例如:上个例子中添加两行“line1" "line2"
eg:sed '/#/r\line1\nline2' /etc/fstab

r file:把file中的内容添加到指定文件中的指定位置
例如:把/etc/fstab中的内容添加到/etc/inittab中的第二行后面
eg: sed '2r /etc/fstab' /etc/inittab

w file:把指定文件的指定内容保存到 file中
例如:把/etc/fstab中的以小写字母开头的行保存到/tmp/fstab.out中
eg: sed '/[a-z]/w /tmp/fstab.out' /etc/fstab

n:依次读取下一行,第一条被覆盖;eg:sed -n '1n;p' /etc/test 结果如下:
She like her like.
Dove love her like.
N:依次下一行 追加;在读取一行之后,再读一行 以追加的方式 在模式空间中是一行,显示出两行,去掉中间的换行符,两行合并为一行
eg:sed -n '1N;p' /etc/fstab
结果如下:
He love his love.
She like her like.
Dove love her like.
                                    
eg: sed  '1N;s/\n/ /' test         把换行符替换成空白,即去掉换行符
结果如下:
He love his love. She like her like.
Dove love her like.


扩展用法

sed '/模式1/,/模式2/command' input_file  
对从被模式1匹配到的行开始 到被模式2匹配到的行结束之间的内容进行指定的command处理

sed 's/被替换的内容/替换的内容/g' input_file 
实现内容的替换,g表示全文操作;若不用g,则只操作第一次匹配到的内容。除了g还有i,表示不区分大小写
操作1:每一行结尾处的单词都添加一个r
eg: sed 's/\(l..e\)\./\1r./' test              [对l..e做引用,"."需要转义]  

操作2:把大写H替换成小写h  
eg:sed 's/H/h/' test

操作3:把操作1和操作2同时执行 
eg:sed -e 's/\(l..e\)\./\1r./' -e 's/H/h/' test 或者   sed 's/\(l..e\)\./\1r./;s/H/h/' test


sed的基本命令和用法就说到这里,不足的地方,期待指正。