您的位置:首页 > 运维架构 > Linux

Linux文本处理三剑客之sed

2015-11-09 23:04 791 查看
昨天讲完了grep,以及实现grep高级过滤功能所必须得正则表达式,那么今天我们来讲解三剑客之中的sed命令。

一、什么是sed

二、sed命令详解
三、sed实例

一.什么是sed(Stream EDitor)
sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等

2、sed命令详解
1.命令语法
sed - stream editor for filtering and transforming text

SYNOPSIS
sed options  'AddressCommand' file ....
2.options
-n: 静默模式,不再默认显示模式空间中的内容
-i: 直接修改原文件
-r: 表示使用扩展正则表达式
-e SCRIPT -e SCRIPT:可以同时执行多个脚本
-f /PATH/TO/SED_SCRIPT, 如sed -f /path/to/scripts  file
3.Address
Startline,Endline:匹配起始和结束,如:1,100表示第1行到第100行  $则表示最后一行

/Pattern(RegExp)/:匹配模式的行,如/^root/

/Pattern1/,/Pattern2/:第一匹配到行pattern1,到第一次匹配到patter2 如/root/,/ftp/

LineNumber 指定行   如:10 表示第10行

startline,+N:从startline开始,向后的N行 如:4,+2 第4行和向下的2行
4.Command
a \:在当前行下面插入文本
i \:在当前行上面插入文本
r file:从file中读行
w file:写并追加模板块到file末尾
W file:写并追加模板块的第一行到file末尾
s:替换指定字符,修饰符g:全局替换,修饰符i:忽略字符大小写
d:删除,删除选择的行
p:打印模板块的行
P:打印模板块的第一行
c \ :把选定的行改为新的文本
D:删除模板块的第一行
h:拷贝模板块的内容到内存中的缓冲区
H:追加模板块的内容到内存中的缓冲区
g:获得内存缓冲区的内容,并替代当前模板块中的文本
G:获得内存缓冲区的内容,并追加到当前模板块文本的后面
l:列表不能打印字符的清单
n:读取下一个输入行,用下一个命令处理新的行而不是用第一个命令
N:追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码
q:退出Sed
b:lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾
!:表示后面的命令对所有没有被选定的行发生作用
=:打印当前行号码
#:把注释扩展到下一个换行符以前
5.正则元字符

^ 匹配行开始,如:/^sed/匹配所有以sed开头的行
$ 匹配行结束,如:/sed$/匹配所有以sed结尾的行
. 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d
* 匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行
[] 匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed
[^] 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行
\(..\) 匹配子串,保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers
& 保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**
\< 匹配单词的开始,如:/\ 匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行
\> 匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行
x\{m\} 重复字符x,m次,如:/0\{5\}/匹配包含5个0的行
x\{m,\} 重复字符x,至少m次,如:/0\{5,\}/匹配至少有5个0的行
x\{m,n\} 重复字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10个0的行

三、sed实例
1.删除空白行
[root@soysauce ~]# sed '/^$/d' /etc/inittab

2.删除每行行首的空白字符
[root@soysauce ~]# sed  's@^[[:space:]]*@ @g' /etc/inittab
3.替换/etc/passwd文件中的root为ROOT

[root@soysauce ~]# sed -n  's/root/ROOT/p' /etc/passwd  # -n静默模式,p打印匹配到的行
ROOT:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/ROOT:/sbin/nologin
4.删除第10行到最后一行

[root@soysauce ~]# sed  '10,$d' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
5.为第1行以及向后的4行所有以非空白字符和非#号开头的行添加注释
[root@soysauce ~]# sed  -r "1,+4s/^([^[:space:]#])/#\1/g" /etc/passwd
#root:x:0:0:root:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
#daemon:x:2:2:daemon:/sbin:/sbin/nologin
#adm:x:3:4:adm:/var/adm:/sbin/nologin
#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync                # 篇幅过长,故只截取一部分
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
6.在/etc/passwd文件中查找到root字符串所在行后面插上两行

[root@soysauce ~]# sed '/root/a\
hello,world\
hello,python' /etc/passwd
root:x:0:0:root:/root:/bin/bash
hello,world
hello,python
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
news:x:9:13:news:/etc/news:
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
hello,world
hello,python
7.只打印第1行和第4行
[root@soysauce ~]# sed -n  "1p;4p" /etc/passwd
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
8.打印第1行至第4行
[root@soysauce ~]# sed -n  "1,4p" /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
9.打印从第1行开始,步阶数为2的行,也即第1行,第3行,第5行...
[root@soysauce ~]# sed -n  "1~2p" /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nscd:x:28:28:NSCD Daemon:/:/sbin/nologin
pcap:x:77:77::/var/arpwatch:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin
smmsp:x:51:51::/var/spool/mqueue:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
mysql:x:101:158::/home/mysql:/bin/bash
redhat:x:500:500:redhat,redhat.com,110,120:/home/redhat:/sbin/nologin
10.替换/etc/inittab文件中"id:3:initdefault:"一行中的数字为5
[root@soysauce ~]# sed 's@\(id:\)[0-9]\(:initdefault:\)@\15\2@g' /etc/inittab
id:5:initdefault:       # 如想直接修改文本就加上-i选项
11.删除/etc/inittab文件中开头的#号
[root@soysauce ~]# sed 's@^#@@g' /etc/inittab
12.删除某文件中开头的#号及后面的空白字符,但要求#号后面必须有空白字符
[root@soysauce ~]# sed -r 's@^#[[:space:]]+@@g' /etc/inittab
13.取出一个文件路径的目录名称和基名
[root@soysauce ~]# echo "/etc/rc.d/" | sed -r 's@^(/.*)/[^[:space:]]+@\1@g'
/etc
[root@soysauce ~]# echo "/etc/inittab" | sed -r 's@^/.*/([^[:space:]]+)@\1@g'
inittab
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息