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