Sed,即Stream EDitor的缩写,是Linux操作系统中常见的文本处理工具,可以结合正则表达式简单方便地对文本进行处理。本文将以实例的方式介绍sed的基本用法。

基本使用方法

基本语法:sed [OPTION] [AddressCommand] FILE1 FILE2......

OPTION{常用}

-n:静默模式,不显示模式空间

-i:直接修改源文件

-e SCRIPT -e SCRIPT:可以同时执行多个脚本

-f /APATH/TO/SED_FILE:从文件中读取脚本,执行

-r:表示支持扩展正则表达式

Adress

1.StartLineEndline

如:1,100

2./RegExp/

/^root/:匹配以root开始的行

/$/:最后一行

3./pattern1//pattern2/:从第一次被模式1匹配到的行到第一次被模式2匹配到的行

4.LineNumber

指定的行

5.StartLine+N

StartLine开始,向后的N

Command

d:删除匹配到的行

例:删除/etc/fstab文件中的前三行文本

[root@localhost tmp]# sed '1,+2d' /etc/fstab

p:显示符合条件的行,被匹配到的行会显示两次,未被匹配到的行只显示一次

例:只显示/etc/fstab文件中以#开头的行

[root@localhost tmp]# sed -n '/^#/p' /etc/fstab

a \string 在匹配到的行后面增加行

例:在文件/etc/fstab文件中以#开头的行后面插入hahah这一行

[root@localhost tmp]# sed '/^#/a\hahaha' /etc/fstab

i \string 用法同a,在符合条件的行前面添加新行

r FILE后接文件,在匹配到的行后读入文件中的内容

例:在/etc/fstab文件中的第一行和第二行读入文件/etc/passwd

[root@localhost tmp]# sed '1,2r/etc/passwd' /etc/fstab 

w FILE:将地址指定的范围内的行另存至指定的文件中

例:将温江/etc/fstab中的第一行和第二行保存到/tmp/fstab文件中

[root@localhost tmp]# sed '1,2w/tmp/fstab' /etc/fstab

s/pattern/string/[修饰符:查找替换,默认只替换每行中第一次被模式匹配到的字符串

修饰符:

g:全局替换

i:忽略大小写

例:把文件test.txt中以o结尾的字符后面加d

[root@localhost tmp]# sed 's@\(o$\)@\1d@g' test.txt

例:去掉history命令的行首的所有空格

[root@localhost tmp]# history | sed 's@^[[:space:]]*@@g'

综合实例

1:删除/etc/grub.conf文件中行首的空白字符

[root@localhost tmp]# sed 's@^[[:space:]]*@@' /etc/grub.conf


wKioL1VUxGvBEgEaAAQjuweaXhs342.jpg

 

2:替换/etc/inittab文件中id3initdefault一行中的数字为5

[root@localhost tmp]# sed 's/id:3:initdefault:\(.*\)/id:5:initdefault"\1/g' /etc/inittab


wKioL1VUxI_h1KJsAAD78UjnniM237.jpg

3:删除/etc/inittab文件中的空白行

[root@localhost tmp]# sed '/^$/d' /etc/inittab


wKioL1VUxKbTDZ8nAAI1y-SNJUg468.jpg

 

4:删除/etc/inittab文件中开头的#

[root@localhost tmp]# sed 's/^#//' /etc/inittab


wKiom1VUw0TiBSlOAAEXA9jdrhs004.jpg

 

5:删除某文件中开头的#号但要求#号后面必须有空白字符

原文件内容如下


wKioL1VUxNbCRpoTAACO-D6-Uv0667.jpg

 

[root@localhost tmp]# sed 's/#*\([[:space:]]\+\)/\1/' test.txt


wKiom1VUw3XS50H9AADDjm8jOlY872.jpg

 

6:删除某文件中以空白字符后面跟#号的行中的开头的空白字符及#


wKiom1VUw4vAdkYtAAF3p-vL-Rg864.jpg

7:取出一个文件路径的目录名称

[root@localhost tmp]# echo "/etc/yum.repo/new.repo" | sed 's@/.*/\(.*\)/.*@\1@'


wKiom1VUw6Xjf6WOAAHgBly3P8k414.jpg