Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选

首页 / 操作系统 / Linux / Linux正则表达式sed 详述

sed、awk工具可以实现文本替换并且把替换的文本输出到屏幕上
sed和awk都是流式编辑器,是针对文档的行来操作的。sed通常用来替换操作。示例的文本内容,以下操作根据此文本。
[root@linuxidc ~]# cat test.txt 
rot:x:0:0:rot:/rot:/bin/bash
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooot:x:0:0/roooooot:/bin/bash
11111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa1、打印某一行
sed -n "n"p filename 单引号内的n是一个数字,表示第几行;p也可以写到引号内;示例,打印passwd第3-5行;[root@linuxidc ~]# sed -n "3,5"p /etc/passwd
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打印所有行[root@linuxidc ~]# sed -n "1,$"p /etc/passwd打印某一行,并且要显示行号,需要和grep一起使用;[root@localhost ~]# grep -n ".*" test.txt | sed -n "1"p
1:rrt2、打印包含某个字符串的行字符串需要用/ /括起来;grep中的特殊符号^ $ . * 同样适用于sed中。
[root@linuxidc ~]# sed -n "/root/"p /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin打印包含/sbin/nologin的行,/需要进行脱意;
[root@linuxidc ~]# sed -n "//sbin/nologin/"p passwd 
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打印以d开头的行;打印以in结尾的;打印r与o字母中间有2个任意字符的;打印包含2个o及多个o的行;
[root@linuxidc ~]# sed -n "/^d/"p test.txt 
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@linuxidc ~]# sed -n "/in$/"p test.txt 
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@linuxidc ~]# sed -n "/r..o/"p test.txt
rooooot:x:0:0/roooooot:/bin/bash
[root@linuxidc ~]# sed -n "/ooo*/"p test.txt
root:x:0:0:root:/root:/bin/bash
rooooot:x:0:0/roooooot:/bin/bash3、-e可以实现多个行为
[root@linuxidc ~]# sed -e "1"p -e "/111/"p -n test.txt 
rot:x:0:0:rot:/rot:/bin/bash
11111111111111111111111111111111可以用-e写多个;-e相当于传送带,先匹配最前面的打印,再匹配后面的打印,所以第一行会打印2次;[root@localhost ~]# sed -e "/root/p" -e "/bash/p" -n 1.txt
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
user1:x:500:500::/home/user1:/bin/bash
user2:x:501:501::/home/user2:/bin/bash-e后面也可以用;分号;-n不能写到-e的后面,可以写在-e的前面或最后面;
[root@localhost ~]# sed -e "/root/p;/bash/p" -n 1.txt
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
user1:x:500:500::/home/user1:/bin/bash
user2:x:501:501::/home/user2:/bin/bash4、删除某行或者多行‘d’ 这个字符就是删除的动作了,不仅可以删除指定的单行以及多行,而且还可以删除匹配某个字符的行,另外还可以删除从某一行一直到文档末行。示例,删除第一行;删除1-3行;删除包含root关键词的行;删除第3行到最后一行所有行;
[root@linuxidc ~]# sed "1"d test.txt 
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooot:x:0:0/roooooot:/bin/bash
11111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[root@linuxidc ~]# sed "1,3"d test.txt 
rooooot:x:0:0/roooooot:/bin/bash
11111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[root@linuxidc ~]# sed "/root/"d test.txt
rot:x:0:0:rot:/rot:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooot:x:0:0/roooooot:/bin/bash
11111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[root@linuxidc ~]# sed "3,$"d test.txt 
rot:x:0:0:rot:/rot:/bin/bash
root:x:0:0:root:/root:/bin/bash5、替换字符或替换字符串示例,替换第一行字母r为R;替换1-2行中ot为to;替换所有行中ot为to;
[root@localhost ~]# sed "1s/r/R/g" test.txt 
RRt
[root@linuxidc ~]# sed "1,2s/ot/to/g" test.txt 
rto:x:0:0:rto:/rto:/bin/bash
roto:x:0:0:roto:/roto:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooot:x:0:0/roooooot:/bin/bash
11111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[root@linuxidc ~]# sed "s#ot#to#g" test.txt 
rto:x:0:0:rto:/rto:/bin/bash
roto:x:0:0:roto:/roto:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
rooooto:x:0:0/roooooto:/bin/bash
11111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa与vim编辑器里面替换一样的命令格式,s代表替换,g代表全局,不加g的话只替换行的第一个;可以使用# @作为分隔符。1s代表只替换第一行;1,3s代表第一行到第三行;不加行数的话默认为全部行。示例,删除文档中所有的数字"s/[0-9]//g"  如删除文档中所有的字母"s/[a-zA-Z]//g"删除所有的数字和字母"s/[0-9a-zA-Z]//g"
[root@linuxidc ~]# sed "s/[0-9]//g" test.txt 
rot:x:::rot:/rot:/bin/bash
root:x:::root:/root:/bin/bash
daemon:x:::daemon:/sbin:/sbin/nologin
rooooot:x::/roooooot:/bin/bash
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa示例,删除文档中所有的字母
[root@linuxidc ~]# sed "s/[a-z]//g" 1.txt 
::0:0:/://
::11:0::/://
::11:0::/://
::0:0:/://
1111111111111111111111111111111示例,删除文档中不是英文字母的(数字和特殊符号)
[root@linuxidc ~]# sed "s/[^a-z]//g" 1.txt 
rotxrotbinbash
operatorxoperatorrootsbinnologin
operatorxoperatorroootsbinnologin
rooootxroooootbinbash
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa示例,删除文档中不是数字的(英文字母和特殊符号)[root@linuxidc ~]# sed "s/[^0-9]//g" 1.txt 
00
110
110
00
1111111111111111111111111111111示例,把文档中的小写字母全部替换为大写字母 "s/[a-z]/u&/g"
[root@linuxidc ~]# sed "s/[a-z]/u&/g" 1.txt 
ROT:X:0:0:/ROT:/BIN/BASH
OPERATOR:X:11:0:OPERATOR:/ROOT:/SBIN/NOLOGIN
OPERATOR:X:11:0:OPERATOR:/ROOOT:/SBIN/NOLOGIN
ROOOOT:X:0:0:/ROOOOOT:/BIN/BASH
1111111111111111111111111111111
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA示例,把文档中的大写字母全部替换为小写字母 "s/[A-Z]/l&/g"[root@linuxidc ~]# sed "s/[A-Z]/l&/g" 1.txt 
rot:x:0:0:/rot:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
operator:x:11:0:operator:/rooot:/sbin/nologin
roooot:x:0:0:/rooooot:/bin/bash
1111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa替换的同时加-n p 打印特定的行;[root@linuxidc ~]# sed -n "1s/[a-z]/u&/g"p 1.txt 
ROT:X:0:0:/ROT:/BIN/BASH6、调换二个字符串的位置
sed -r "s/([^:]+)(:.*:)([^:]+$)/321/"
[^:]非冒号,不是冒号的所有字符
-r, --regexp-extended  在脚本中使用扩展正则表达式; 加r选项的意思为后面不用再加脱意 
( )括号括起来是分段的意思,
321    是代表3调换1,后面的内容调换到前面示例,aa与ff调换;加-r选项不用加脱意符号;不加-r ( )括号左右都需要加脱意;调换多行用最后一个;
[root@localhost ~]# cat 1.txt 
aa:bb:cc:dd:ee:ff
[root@localhost ~]# sed -r "s/(aa)(.*)(ff)/321/" 1.txt
ff:bb:cc:dd:ee:aa
[root@localhost ~]# sed "s/(aa)(.*)(ff)/321/" 1.txt 
ff:bb:cc:dd:ee:aa
[root@localhost ~]# sed -r "s/([^:]+)(:.*:)([^:]+$)/321/" 1.txt 
ff:bb:cc:dd:ee:aa示例,rot与/bin/bash进行调换
[root@localhost ~]# grep "rot" test.txt
rot:x:0:0:rot:/rot:/bin/bash
[root@localhost ~]# grep "rot" test.txt |sed "s/(rot)(.*)(/bin/bash)/321/"
/bin/bash:x:0:0:rot:/rot:rot
[root@localhost ~]# grep "rot" test.txt |sed -r "s/(rot)(.*)(/bin/bash)/321/"
sed:-e 表达式 #1,字符 18:“s”的未知选项
[root@localhost ~]# grep "rot" test.txt |sed -r "s/(rot)(.*)(/bin/bash)/321/"
/bin/bash:x:0:0:rot:/rot:rot加-r  后()内的/bin/bash 也还需要脱意才可以;-i 选项    直接替换字符,并且保存原文件里面。使用i选项前,记得备份原文件。[root@localhost ~]# sed -r -i "s/([^:]+)(:.*:)([^:]+$)/321/" 1.txt 
[root@localhost ~]# cat 1.txt 
ff:bb:cc:dd:ee:aa在sed命令中引入shell变量 http://www.linuxidc.com/Linux/2014-03/97896.htmLinux下Shell编程——sed命令基本用法 http://www.linuxidc.com/Linux/2013-06/85526.htmUnix文本处理工具之sed  http://www.linuxidc.com/Linux/2013-08/89315.htmsed 高级用法 http://www.linuxidc.com/Linux/2014-09/106961.htmsed命令详解与示例 http://www.linuxidc.com/Linux/2014-11/109325.htm本文永久更新链接地址