您的位置:首页 > 其它

sed命令详解及实例

2015-03-02 14:01 323 查看
要想灵活的并按照需要处理文本,我们需要充分的学会并掌握三大文本处理工具,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/


本文出自 “无知有知” 博客,请务必保留此出处http://yujiqing.blog.51cto.com/1475974/1616458
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: