Linux文本处理三剑客之sed

   昨天讲完了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


你可能感兴趣的:(sed,文本处理三剑客)