sed用法详解

1、命令格式:

格式1

#sed [选项]   ‘编辑指令’  文件列表(多个文件间空格间隔)


格式2

前置命令  |  sed  [选项]  ‘编辑指令




2、常见选项

1-n

――屏蔽默认输出,仅输出符合条件的文本


2-i

――直接修改文件内容

正常情况下,sed命令所做的处理只是把操作结果(包括打印、删除等)输出到当前终端屏幕,而并不会对原始文件做任何更改。若希望直接修改文件内容,可添加选项 -i




3-e

――一起执行多个处理动作

如果不使用 -e ,也可以用分号来隔离多个操作



4-f

――使用sed脚本


5-r

――启用拓展的正则表达式





3、编辑指令:

1)其中,“编辑指令”用来实现过滤操作,由“[定址符]处理动作”组成;

2)而“定址符”用来定义需要操作的文本,由“[地址1,[地址2]]组成,地址1为起始位置,地址2为结束位置;

3)未指定“定址符”时,默认处理所有文本;


4、处理动作(除非加上选项 �Ci ,否则不会修改原文件)


1p

――打印行

1)输出inittab18


[root@localhost ~]# sed -n '18p' /etc/inittab
id:5:initdefault:
[root@localhost ~]#



2)输出inittab4550


[root@localhost ~]# sed -n '45,50p' /etc/inittab
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
[root@localhost ~]#


3)输出文件的47行和仅输出第4行和第7


[root@localhost ~]# cat -n /etc/passwd | sed -n '4,7p'
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     6  sync:x:5:0:sync:/sbin:/bin/sync
     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
[root@localhost ~]#
[root@localhost ~]# cat -n /etc/passwd | sed -n '4p;7p'
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
[root@localhost ~]#


4)输出第2行及之后的3


[root@localhost ~]# cat -n /etc/passwd | sed -n '2,+3p'
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@localhost ~]#


5)输出以mail开头的行

――第一条命令之所以不成功是因为 命令cat 用 -n 参数输出行号后是以行号开头了;所以去掉 -n 参数

[root@localhost ~]# cat -n /etc/passwd | sed -n '/^mail/p'
[root@localhost ~]#
[root@localhost ~]# cat  /etc/passwd | sed -n '/^mail/p'
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
mailnull:x:47:47::/var/spool/mqueue:/sbin/nologin
[root@localhost ~]#




6)输出奇数行或偶数行

―― n表示读取下一行;产生隔行操作的效果。

奇数行:p;n

偶数行:n;p

[root@localhost ~]# cat  -n  /etc/passwd | sed -n 'p;n' 
     1  root:x:0:0:root:/root:/bin/bash
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown


[root@localhost ~]# cat  -n  /etc/passwd | sed -n 'n;p'
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     6  sync:x:5:0:sync:/sbin:/bin/sync
     8  halt:x:7:0:halt:/sbin:/sbin/halt




7)输出40行到最后一行


[root@localhost ~]# cat  -n  /etc/passwd | sed -n '35,$p'
    35  named:x:25:25:Named:/var/named:/sbin/nologin
    36  apache:x:48:48:Apache:/var/www:/sbin/nologin
    37  squid:x:23:23::/var/spool/squid:/sbin/nologin
[root@localhost ~]#


8)输出文本的行数


[root@localhost ~]# cat  -n  /etc/passwd | sed -n '$=' 
37
[root@localhost ~]#



2d(除非加上选项�CI ,否则不会修改原文件)

――删除行

1)删除58


[root@localhost ~]# cat  -n  /etc/passwd | sed  '5,8d'
     1  root:x:0:0:root:/root:/bin/bash
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    10  news:x:9:13:news:/etc/news:



2)从包含mail行开始删,删到3的倍数为止


[root@localhost ~]# cat  -n  /etc/passwd | sed  '/mail/,~3d'


处理前:

8  halt:x:7:0:halt:/sbin:/sbin/halt
     9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    10  news:x:9:13:news:/etc/news:
    11  uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
    12  operator:x:11:0:operator:/root:/sbin/nologin
    13  games:x:12:100:games:/usr/games:/sbin/nologin
    14  gopher:x:13:30:gopher:/var/gopher:/sbin/nologin


处理后:

7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
 8  halt:x:7:0:halt:/sbin:/sbin/halt
13  games:x:12:100:games:/usr/games:/sbin/nologin
14  gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
15  ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
16  nobody:x:99:99:Nobody:/:/sbin/nologin
17  nscd:x:28:28:NSCD Daemon:/:/sbin/nologin



3)从第5行开始删,删到4的倍数为止


[root@localhost ~]# cat  -n  /etc/passwd | sed  '5,~4d'   
     1  root:x:0:0:root:/root:/bin/bash
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    10  news:x:9:13:news:/etc/news:



4)读m行,删掉这m行中的第n行。我也晕~


# cat -n passwd | sed 'n~md'


最典型的应用就是删掉奇数行或偶数行

[root@localhost ~]# cat  -n  /etc/passwd | sed  '1~2d'
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     4  adm:x:3:4:adm:/var/adm:/sbin/nologin
     6  sync:x:5:0:sync:/sbin:/bin/sync
     8  halt:x:7:0:halt:/sbin:/sbin/halt
    10  news:x:9:13:news:/etc/news:



[root@localhost ~]# cat  -n  /etc/passwd | sed  '2~2d'
     1  root:x:0:0:root:/root:/bin/bash
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin
     5  lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
     7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown


5)删掉空行


[root@localhost ~]# cat  -n  /etc/passwd | sed  '/^$/d'



3s(除非加上选项�CI ,否则不会修改原文件)

――替换


1)格式:

#sed  [选项]         ‘[定址符]s/源数据/新数据/选项文件名

#前置命令  | sed  [选项]          ‘[定址符]s/源数据/新数据/选项

定址符:

――是可选项,

源数据:

可以是文件已有的单词,也可以是正则表达式

2)只替换开头单词

[root@localhost ~]# cat  -n  /etc/passwd | sed  's/root/huanglianfeng/g'
     1  huanglianfeng:x:0:0:huanglianfeng:/huanglianfeng:/bin/bash
     2  bin:x:1:1:bin:/bin:/sbin/nologin
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin



3)将每行的第一个bin替换成大写BIN

[root@localhost ~]# cat  -n  /etc/passwd | sed  's/bin/BIN/g'         
     1  root:x:0:0:root:/root:/BIN/bash
     2  BIN:x:1:1:BIN:/BIN:/sBIN/nologin
     3  daemon:x:2:2:daemon:/sBIN:/sBIN/nologin
     4  adm:x:3:4:adm:/var/adm:/sBIN/nologin



4)正则表达式的应用

删除所有的数字:


[root@localhost ~]# cat  -n  /etc/passwd | sed  's/[0-9]//g'
        root:x:::root:/root:/bin/bash
        bin:x:::bin:/bin:/sbin/nologin
        daemon:x:::daemon:/sbin:/sbin/nologin


说一下: s和d都能起到删除的作用;但它们应用的地方时u区别的。

d是以行为单位删除的,比如是删掉某一行或某几行;

s是删掉某些字符,其实质是将它们替换成空字符,达到删除的效果



删掉所有数字和字母:



[root@localhost ~]# cat  -n  /etc/passwd | sed  's/[0-Z]//g'
        :::::/://
        :::::/://
        :::::/://
        ::::://://
        :::::///://



5)指定修改某一行

修改第2行


[root@localhost ~]# cat  -n  /etc/passwd | sed  '2s/bin/BIN/g'        
     1  root:x:0:0:root:/root:/bin/bash
     2  BIN:x:1:1:BIN:/BIN:/sBIN/nologin
     3  daemon:x:2:2:daemon:/sbin:/sbin/nologin



6)替换数据

源数据里面有 / 号,需要转义;每个都要

[root@localhost ~]# cat -n /etc/passwd | sed  's/\/sbin\/nologin/\/bin\/bash/'
     1  root:x:0:0:root:/root:/bin/bash
     2  bin:x:1:1:bin:/bin:/bin/bash
     3  daemon:x:2:2:daemon:/sbin:/bin/bash
     4  adm:x:3:4:adm:/var/adm:/bin/bash
     5  lp:x:4:7:lp:/var/spool/lpd:/bin/bash
     6  sync:x:5:0:sync:/sbin:/bin/sync



7() 后项引用,保存已匹配的数据

修改IP地址网段


[root@localhost ~]# sed -r '/^IPADDR/s/192.168.10.(.*)/172.16.16.\1/' /etc/sysconfig/network-scripts/ifcfg-eth0
# Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE]
DEVICE=eth0
BOOTPROTO=static
HWADDR=00:0c:29:9b:2a:c7
ONBOOT=yes
NETMASK=255.255.255.0
IPADDR=172.16.16.2
#GATEWAY=192.168.10.254
TYPE=Ethernet
USERCTL=no
IPV6INIT=no
PEERDNS=yes
[root@localhost ~]

















你可能感兴趣的:(linux,正则表达式,linuxshell,sed用法详解)