sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
常用选项:
-n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e∶直接在指令列模式上进行 sed 的动作编辑;
-f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
-r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
-i∶直接修改读取的档案内容,而不是由萤幕输出。
常用命令:
a ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
s ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
1.以行为单位进行新增/删除:
[root@hpf-linux 222]# nl passwd |sed '1d' //删除第一行 2 bin:x:1:1:bin:/bin:/sbin/nologin 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@hpf-linux 222]# nl passwd |sed '1,5d' //删除1-5行 6 sync:x:5:0:sync:/sbin:/bin/sync 7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
[root@hpf-linux 222]# nl passwd |sed '2,$d' //删除2到最后一行 1 rootmail:x:0:0:root:/root:/bin/bash
[root@hpf-linux 222]# nl passwd |sed '2a linuxer' //在第二行后添加linuxer 1 rootmail:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin linuxer 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@hpf-linux 222]# nl passwd |sed '2i linuxer' //在第二行前添加linuxer 1 rootmail:x:0:0:root:/root:/bin/bash linuxer 2 bin:x:1:1:bin:/bin:/sbin/nologin
[root@hpf-linux 222]# nl passwd |sed '2i linuxer\ndotaer' //在第二行前增加多行用\n换行符 1 rootmail:x:0:0:root:/root:/bin/bash linuxer dotaer 2 bin:x:1:1:bin:/bin:/sbin/nologin
[root@hpf-linux 222]# nl passwd |sed '1,3i linuxer'//在第一行到第三行前添加linuxer linuxer 1 rootmail:x:0:0:root:/root:/bin/bash linuxer 2 bin:x:1:1:bin:/bin:/sbin/nologin linuxer 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@hpf-linux 222]# nl passwd |sed '1c linuxer'//将第一行替代为linuxer linuxer 2 bin:x:1:1:bin:/bin:/sbin/nologin
[root@hpf-linux 222]# nl passwd |sed '1,2c linuxer'//将第一行和第二行替换为linuxer linuxer 3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@hpf-linux 222]# nl passwd |sed '1p' -n //显示第一行需要和-n选项一块使用 1 rootmail:x:0:0:root:/root:/bin/bash [root@hpf-linux 222]# nl passwd |sed '$p' -n //显示最后一行 63 ababababababab [root@hpf-linux 222]# nl passwd |sed '1,2p' -n //显示1-2行 1 rootmail:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin [root@hpf-linux 222]# nl passwd |sed '4,$p' -n //显示第四行到最后一行 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 ......
2.数据的搜寻并显示/删除
[root@hpf-linux 222]# nl passwd |sed '/root/p' -n //显示带有root的行 1 rootmail:x:0:0:root:/root:/bin/bash 11 operator:x:11:0:operator:/root:/sbin/nologin
[root@hpf-linux 222]# nl passwd |sed '/root/d'//删除带有root的行 2 bin:x:1:1:bin:/bin:/sbin/nologin ...... 10 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin 12 games:x:12:100:games:/usr/games:/sbin/nologin
3.数据的搜寻并替换
[root@hpf-linux 222]# nl passwd |sed 's/root/ROOT/g'//后面带g代表全局替换 1 ROOTmail:x:0:0:ROOT:/ROOT:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin ...... 10 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin 11 operator:x:11:0:operator:/ROOT:/sbin/nologin 12 games:x:12:100:games:/usr/games:/sbin/nologin [root@hpf-linux 222]# nl passwd |sed '1,5s/root/ROOT/g'//替换1-5的root替换为ROOT 1 ROOTmail:x:0:0:ROOT:/ROOT:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin ........... 10 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin 11 operator:x:11:0:operator:/root:/sbin/nologin 12 games:x:12:100:games:/usr/games:/sbin/nologin
[root@hpf-linux 222]# nl passwd |sed 's/root/ROOT/'//不带g则只会替换每行的第一个 1 ROOTmail:x:0:0:root:/root:/bin/bash 2 bin:x:1:1:bin:/bin:/sbin/nologin ....... 10 uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin 11 operator:x:11:0:operator:/ROOT:/sbin/nologin 12 games:x:12:100:games:/usr/games:/sbin/nologin
[root@hpf-linux 222]# nl passwd |sed -n 's/root/ROOT/p' //只显示替换后的行 1 ROOTmail:x:0:0:root:/root:/bin/bash 11 operator:x:11:0:operator:/ROOT:/sbin/nologin
[root@hpf-linux 222]# sed -n 's/^mysql/mymysql/p' passwd//将以mysql开头的行替换为mymysql mymysql:x:503:503::/home/mysql:/sbin/nologin [root@hpf-linux 222]# sed -n 's/^mysql/&root/p' passwd //&符号表示替换换字符串中被找到的部份, 所有以mysql开头的行都会被替换成它自已加root,变成mysqlroot。 mysqlroot:x:503:503::/home/mysql:/sbin/nologin [root@hpf-linux 222]# sed 's/[a-z]/\U&/g' passwd //将小写字母替换成大写字母 ROOTMAIL:X:0:0:ROOT:/ROOT:/BIN/BASH BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN DAEMON:X:2:2:DROATAEMON:/SBIN:/SBIN/NOLOGIN ADM:X:3:4:ADM:/VARRTOOOO/ADM:/SBIN/NOLOGIN LP:X:4:7:LP:/VAR/SPROOOOTOOL/LPD:/SBIN/NOLOGIN [root@hpf-linux 222]# sed 's/[A-Z]/\l&/g' passwd //将大写字母替换成小写字母 rootmail:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:droataemon:/sbin:/sbin/nologin adm:x:3:4:adm:/varrtoooo/adm:/sbin/nologin lp:x:4:7:lp:/var/sprooootool/lpd:/sbin/nologin
[root@hpf-linux 222]# sed -nr 's/(roo)t/\1T/p' passwd //roo倍标记为1,所有root都会替换为rooT并且打印出来 rooTmail:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/rooT:/sbin/nologin
[root@hpf-linux 222]# nl passwd |sed 's/[0-9]//g'//将文本中所有的数字删除 rootmail:x:::root:/root:/bin/bash bin:x:::bin:/bin:/sbin/nologin daemon:x:::droataemon:/sbin:/sbin/nologin adm:x:::adm:/varrtoooo/adm:/sbin/nologin lp:x:::lp:/var/sprooootool/lpd:/sbin/nologin [root@hpf-linux 222]# nl passwd |sed 's/[^0-9]//g'//将文本中所有的非数字删除 100 211 322 434 547 650
4. 正则在sed的应用
[root@hpf-linux 222]# nl passwd |sed -n '/r..t/p'//.. 表示两个任意字符 1 rootmail:x:0:0:root:/root:/bin/bash 3 daemon:x:2:2:droataemon:/sbin:/sbin/nologin 7 shutdown:x:6:0:shutdowr tn:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/ro tsbin/halt
[root@hpf-linux 222]# nl passwd |sed -n '/ro*t/p'//*表示零个或者任意个*前面的字符 1 rootmail:x:0:0:root:/root:/bin/bash 4 adm:x:3:4:adm:/varrtoooo/adm:/sbin/nologin 5 lp:x:4:7:lp:/var/sprooootool/lpd:/sbin/nologin 11 operator:x:11:0:operator:/root:/sbin/nologin
[root@hpf-linux 222]# nl passwd |sed -n '/r.*t/p'//.*贪婪匹配任意个任意字符 1 rootmail:x:0:0:root:/root:/bin/bash 3 daemon:x:2:2:droataemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/varrtoooo/adm:/sbin/nologin 5 lp:x:4:7:lp:/var/sprooootool/lpd:/sbin/nologin 7 shutdown:x:6:0:shutdowr tn:/sbin:/sbin/shutdown 8 halt:x:7:0:halt:/sbin:/ro tsbin/halt
[root@hpf-linux 222]# nl passwd |sed -n '/ro+t/p'//由于+、?、|、()为扩展正则则需要转意或者添加-r选项 [root@hpf-linux 222]#
[root@hpf-linux 222]# nl passwd |sed -nr '/ro+t/p'//+一个或者多个前面的字符 1 rootmail:x:0:0:root:/root:/bin/bash 5 lp:x:4:7:lp:/var/sprooootool/lpd:/sbin/nologin 11 operator:x:11:0:operator:/root:/sbin/nologin
[root@hpf-linux 222]# nl passwd |sed -nr '/ro?t/p'//?零个或者一个前面的字符 4 adm:x:3:4:adm:/varrtoooo/adm:/sbin/nologin 17 vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
[root@hpf-linux 222]# nl passwd |sed -nr '/r[o|a]t/p'//[o|a]表示o、|、a三个任意一个 11 operator:x:11:0:operator:/root:/sbin/nologin 20 sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
5.sed 的-e选项的使用
[root@hpf-linux 222]# nl passwd |sed -n -e '/root/p' -e '/mail/p' 1 rootmail:x:0:0:root:/root:/bin/bash 1 rootmail:x:0:0:root:/root:/bin/bash 9 mail:x:8:12:mail:/var/spoolroat/mail:/sbin/nologin 11 operator:x:11:0:operator:/root:/sbin/nologin
从上例中可以发现第一行被匹配了两次,我们可以这样理解:当一行与-e '/root/p'匹配时符合要求则打印输出,接着该行行会与 -e '/mail/p' 进行匹配若还符合则仍会输出打印。
[root@hpf-linux 222]# nl passwd |sed -n '/root/p;/mail/p' 1 rootmail:x:0:0:root:/root:/bin/bash 1 rootmail:x:0:0:root:/root:/bin/bash 9 mail:x:8:12:mail:/var/spoolroat/mail:/sbin/nologin 11 operator:x:11:0:operator:/root:/sbin/nologin 上例的输出与-e的一样,目前对于这样的写法还不是很明白,今后还需阅读相关书籍将该知识点学会. [root@hpf-linux 222]# nl passwd |egrep -e 'root' -e 'mail' 1 rootmail:x:0:0:root:/root:/bin/bash 9 mail:x:8:12:mail:/var/spoolroat/mail:/sbin/nologin 11 operator:x:11:0:operator:/root:/sbin/nologin grep也有-e选项但与sed不同只会打印一边,这些小知识点今后需要注意
5.sed的顺序调换
[root@hpf-linux 222]# head passwd |sed -r 's/([^:]+)(:.*:)([^:]+$)/\3\2\1/' /bin/bash:x:0:0:root:/root:rootmail /sbin/nologin:x:1:1:bin:/bin:bin /sbin/nologin:x:2:2:droataemon:/sbin:daemon /sbin/nologin:x:3:4:adm:/varrtoooo/adm:adm /sbin/nologin:x:4:7:lp:/var/sprooootool/lpd:lp /bin/sync:x:5:0:sync:/sbin:sync /sbin/shutdown:x:6:0:shutdowr tn:/sbin:shutdown /ro tsbin/halt:x:7:0:halt:/sbin:halt /sbin/nologin:x:8:12:mail:/var/spoolroat/mail:mail
[root@hpf-linux 222]# head passwd |sed -r 's/([a-z]+)(:.*:)([/a-z]+)/\3\2\1/' /bin/bash:x:0:0:root:/root:rootmail /sbin/nologin:x:1:1:bin:/bin:bin /sbin/nologin:x:2:2:droataemon:/sbin:daemon /sbin/nologin:x:3:4:adm:/varrtoooo/adm:adm /sbin/nologin:x:4:7:lp:/var/sprooootool/lpd:lp /bin/sync:x:5:0:sync:/sbin:sync /sbin/shutdown:x:6:0:shutdowr tn:/sbin:shutdown /ro:x:7:0:halt:/sbin:halt tsbin/halt /sbin/nologin:x:8:12:mail:/var/spoolroat/mail:mail /sbin/nologin:x:10:14:uucp:/var/spool/uucp:uucp
以上两种方法均可,像这样的还有好多全看本人对于正则的理解了!