要想灵活的并按照需要处理文本,我们需要充分的学会并掌握三大文本处理工具,grep、sed(数据流编辑器)、awk(报告文本的生成器)
下面介绍并学习sed命令的基本用法
sed又名stream editer,是行编辑器(编辑器包括字处理器和文本编辑器),是文本编辑器,是操作纯Ascii码文本的,操作文本是按行进行操作的,逐行处理文本,默认并不直接处理文本本身,操作时是将文本逐行读取到内存中,在内存中处理后并将符合模式匹配到的行显示到屏幕上,内存空间称为sed模式空间。 默认是打印模式空间。
SYNOPSIS
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
sed [OPTION]... 'AddressCommand' file....地址加命令
$:表示文本中的最后一行
Option:
-n:表示静默模式,不显示模式空间中的内容,只与命令相关
-i:直接修改原文件
-e script -e script:可以同进执行多个脚本
-f /path/to/sed_script: 表示读取文件中的脚本对文本进行处理
sed -f /script file..
-r:表示使用扩展正则表达式
Address:
1、startline,endline,如1,10指从第一行到第10行;
2、/pattern(regexp正则表达式)/,如/^root/找出以root开头的行
3、/pattern1/,/pattern2/,表示第一次被模式1匹配到的行和第一次被模式2匹配到的行中间所有的行。
4、linenumber表示批定的行或特定的行
5、startline,+N,表示从startline开始后的N行,总共是N+1行;
Command:
d:表示删除符合条件的行;
如:删除/etc/fstab文件中的前四行,如第一行到倒数第二行,则为1,$-1
[root@station01 ~]# sed "1,4d" /etc/fstab
如:删除包含sys的行
[root@station01 ~]# sed "/sys/d" /etc/fstab
如:删除第一行开始向后十行的内容
[root@station01 ~]# sed "1,+10d" /etc/fstab
如:只删除第五行则
[root@station01 ~]# sed "5d" /etc/fstab
p:表示显示符合条件的行,默认显示模式空间中的一次和命令匹配到的一次,共二次
如:显示文件中以/开头的行,并只显示符合条件的行
[root@station01 ~]# sed -n "/^\//p" /etc/fstab
a \sting:在批定或匹配到的行后面新增一行,内容为string
如:在/开头的行后新增一行,内容为“# It is a blank line.”
[root@station01 ~]# sed '/^\//a \# It is a blank line.' /etc/fstab
如:在/开头的行后新增两行,内容为“# It is first blank line.”“# It is second blank line.”
[root@station01 ~]# sed '/^\//a \# It is first blank line.\n# It is second blank line' /etc/fstab
i \sting:在批定或匹配到的行前面新增一行,内容为string
r filename:表示在指定的行后将指定的文件内容添加进来,用于合并文件内容
如:将/etc/issue文件的内容添加到/etc/fstab文件的第二行后
[root@station01 ~]# sed '2r /etc/issue' /etc/fstab
如:将/etc/issue文件的内容添加到/etc/fstab文件的第一行和第二行后
[root@station01 ~]# sed '1,2r /etc/issue' /etc/fstab
w filename:将批定范围内的内容另存至指定的文件中
如:将包含oot中的文件内容保存到/tmp/oot.tmp文体中,可以使用-n选项
[root@station01 ~]# sed '/oot/w /tmp/oot.tmp' /etc/fstab
s/pattern(可以用正则表达式的元字符)/string/修饰符:表示查找匹配到的pattern字符串并替换为string,默认是每一行中第一次被模式匹配到的字符串,如需要替换行中被模式匹配到的所有字符串,则需要加修饰符;其中的/可以换成其它的字符,确保一致即可,并且不需要转义,如###,@@@,%%%等
g:全局替换修饰符
i:查找时忽略大小写
如:将/etc/fstab中包含小写oot的字符串替换为大写的OOT
[root@station01 ~]# sed 's/oot/OOT/' /etc/fstab
如:将/etc/fstab中以/开头的行中的/替换为#
[root@station01 ~]# sed 's/^\//#/' /etc/fstab
如:将/etc/fstab中的所有/替换为#
[root@station01 ~]# sed 's/\//#/g' /etc/fstab
后向引用:
\(\):\1,\2 等
&:表示模式匹配到的整个串
如找出以l开头e结尾中间是任意两个字符,替换为在其后加r
文件内容如下:
[root@station01 ~]# cat sed.txt he like. her love.
#1)执行结果如下:
[root@station01 ~]# sed 's%l..e%&r%' sed.txt he liker. her lover. #2) [root@station01 ~]# sed 's%\(l..e\)%\1r%' sed.txt he liker. her lover.
若要匹配查找字符串中的一部分时,只能使用后向引用,而不能用&
如将l..e,like-->Like,love-->Love时,只能用后向引用
执行结果如下:
[root@station01 ~]# sed 's%l\(..e\)%L\1%' sed.txt he Like. her Love.
如将history命令中的执行结果行首空白删除,并取出行号
[root@station01 ~]# history | sed -r 's#^[[:space:]]+##g' |cut -d' ' -f1
练习题:
1、删除/etc/grub.conf文件中行首的空白字符
[root@station01 ~]# sed -r 's#^[[:space:]]+##g' /etc/grub.conf
2、替换/etc/inittab文件中行中id:3:initdefault:字符串中的3改为6
[root@station01 ~]# sed 's#\(id:\)[0-9]\(:initdefault:\)#\16\2#g' /etc/inittab
3、删除/etc/inittab文件中的空白行
[root@station01 ~]# sed '/^$/d' /etc/inittab
4、删除/etc/inittab文件行中开头的#号
[root@station01 ~]# sed 's/^#//g' /etc/inittab
5、删除某文件中行首的#及其后面的空白字符
文件内容如下
[root@station01 ~]# cat b.txt # It is a blank. #It is second blank.
执行结果:
[root@station01 ~]# sed -r 's%^#[[:space:]]+%%g' b.txt It is a blank. #It is second blank.
6、删除某文件中行首的空白字符及其后的#
文件内容如5中的文件
[root@station01 ~]# sed -r 's%^[[:space:]]+#%%g' b.txt # It is a blank. It is second blank.
7、取出某路径的父目录
[root@station01 ~]# echo "/etc/rc.d/rc4.d/S99local" | sed -r 's@(/.*/)[^/]+/?@\1@g' /etc/rc.d/rc4.d/