1. SED简介  

sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出或者配合编辑选项使用。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。以下介绍的是Gnu版本的Sed 3.02。 

 

2.SED工作模式

读取一行内容——>编辑此行内容——>输出编辑后的结果,并清空模式空间——>读取下一行内容

 

3.用法:sed OPTIONS... [SCRIPT] [INPUTFILE...]

-r: 使用扩展的正则表达式; 

例如:# sed -n -r '/^(dev|tmp)/p' /tmp/fstab.txt

-n, --quiet, --silent: 不输出模式空间的内容;【即:只是输出被匹配到的内容】

例如:# sed -n '1,3p' /etc/fstab

      # sed -n '1,3d' /etc/fstab

-i:直接编辑原文件;

例如:# sed -i '3,7d' /tmp/fstab.txt

-e: -e '' -e '' -e ''

'CMD1;CMD2;CMD3'

例如:# sed -e 's/UUID/uuid/g' -e 's/proc/PROC/g' /tmp/fstab.txt

-f /path/to/sed_script:从指定的文件读取处理脚本

例如:

# vim sed.script

s/UUID/uuid/g

s/proc/PROC/g

3d

# sed -f sed.script /tmp/fstab.txt

 

4.地址定界:

可以通过定址来定位你所希望编辑的行,该地址用数字构成,用逗号分隔的两个行数表示以这两行为起止的行的范围(包括行数表示的那两行)。如1,3表示1,2,3行,美元符号($)表示最后一行。范围可以通过数据,正则表达式或者二者结合的方式确定 。

具体用法如下:

#: 指定行

例如:# sed '10d' /etc/fstab

验证对比:# cat -n /etc/fstab

$: 最后一行

例如:# sed '$d' /etc/fstab

/regexp/:任何能够被regexp匹配到的行

例如:删除以#开头的行:# sed  '/^#/d'  /etc/fstab

 

\%regexp%: 任何能够被regexp匹配到的行;换用%为边界符号;

例如:# sed '/^\/dev\/mapper/d' /etc/fstab

      或# sed '\@^/dev/mapper/@d' /etc/fstab

      或# sed '\%^/dev/mapper/%d' /etc/fstab

/regexp/I

\%regexp%I:匹配时忽略字符大小写;

addr1, addr2: 指定范围内的所有行:

0,/regexp/

#,#

/regexp/,/regexp/

#,+#

first~step:指定起始位置,以及步长

 

5.基本正则表达式元字符:

字符:.  []  [^]

次数:*, \+, \?, \{i,j\}

分组:\(\)

锚定:^, $, \<, \>

或者:\|

后向引用:\1, \2, ...

 

6.编辑命令:

注意:命令之前可以使用!表示取反操作;

 

=: 显示行号【被匹配到的行的行号】

# sed -n '\%/dev/mapper%=' /etc/fstab

# sed -n '\/^[[:upper:]]/=' /etc/fstab

 

d: 删除匹配到的行;

p: 打印模式空间中的内容;

例如:# sed '1,3p' /etc/fstab    【1-3行会重复;因为默认1-3打印一次,加上p命令,再次打印,所以会重复】

通常与-n选项一同使用;

# sed -n '1,3p' /etc/fstab

a \text: append,

a \text1\ntext2\ntext3: 附加多行文本

例如:# sed '/^[[:upper:]]/a \# Upper letters' /etc/fstab

# sed '/^[[:upper:]]/a \# Upper letters\n# test text' /etc/fstab

i \text:insert, 

i \text1\ntext2: 插入多行文本 【插入到匹配到的行之前】

例如:# sed '/^[[:upper:]]/i \# Upper letters\n# test text' /etc/fstab

c \text: change,把匹配到的行替换为给定的文本

例如:# sed '3c \substitue text' /etc/fstab 

s///: 替换命令

# sed 's\UUID\uuid\' /etc/fstab

g: 全局替换

i: 不区分大小写

p: 如果成功替换则打印

w /path/to/somefile: 将替换后的结果保存至指定文件中

例如:# sed 's/tmpfs/TMPFS/gw /tmp/sed.txt' /etc/fstab

      # cat /tmp/sed.txt

w /path/to/somefile:将匹配到文件另存至指定文件中

例如:# sed '3,7w /tmp/fstab.txt' /etc/fstab

      # cat /tmp/fstab.txt

r /path/from/somefile:读取指定文件至匹配到的行处 

例如,将/etc/issue插入到UUID之后

# sed '\/UUID/r /etc/issue' /etc/fstab

 

7.练习

练习1:删除/boot/grub/grub.conf文件中所以空白开头的行行首的空白;

sed 's/^[[:space:]]\+//g' /boot/grub/grub.conf

练习2:删除/etc/fstab文件中所有以#开头,后跟至少一个空白字符的行的行首的#和空白字符;

sed 's/^#[[:space:]]\+//' /etc/fstab

练习3:echo一个文件路径给sed命令,取出其基名;取出其目录名;

# echo "/etc/sysconfig/" | sed 's@[^/]\{1,\}/\?$@@g'

解析:[^/]\{1,\}为非斜线字符出现至少一次

练习4:替换/etc/inittab文件“id:数字:initdefault:”一行中的那个数字为6;

# sed 's@id:[0-9]:initdefault:@id:6:initdefault@' /etc/inittab

 

8.高级编辑命令:

h: 用模式空间中的内容覆盖保持空间中的内容;

H:把模式空间中的内容追求至保持空间;

g: get, 从保持空间取回数据至模式空间,覆盖模式空间中原有

G:GET, 从保持空间取回数据至模式空间,追加于模式空间中现

x: 把模式空间和保持空间中的内容进行交换;

n: 读取匹配到的行下一行至模式空间;

N: 追加读匹配到的行下一行至模式空间;

d: 删除模式空间中的内容;

D:删除多行模式空间中首行;

 

9.常用用法【高级命令】

sed '1!G;h;$!d' FILE

显示文件的偶数行:sed -n 'n;p' FILE;     sed -n '2~2p' FILE

1

2

3

4

显示文件的奇数行:sed -n 'p;n' FILE;     sed -n '1~2;p' FILE

 

10.高级命令练习

练习1:用sed将文件的奇数行与偶数行

# sed '$!N;s@\n@\&\&@g' /etc/issu

练习2:说明以下sed命令的意义:

(1) sed '$!N;$!D' /etc/issue

(2) sed '$!d' /etc/issue

(3) sed 'G' /etc/issue

(4) sed '/^$/d;G' /etc/issue

(5) sed 'n;d' /etc/issue

(6) sed -n '1!G;h;$p' /etc/issue