基础正则三剑客——sed

  • 2019-09-02
  • 0
  • 0

1、基础正则表达式

正则表达式 描述
转义符,将特殊字符进行转义,忽略其特殊意义
\^  匹配行首,awk中,^则是匹配字符串的开始 
匹配行尾,awk中,$则是匹配字符串的结尾
^$  表示空行
匹配除换行符\n之外的任意单个字符
.* 匹配所有
[ ] 匹配包含在[字符]之中的任意一个字符
[^ ] 匹配[^字符]之外的任意一个字符
[ – ]  匹配[]中指定范围内的任意一个字符
? 匹配之前的项1次或者0次
+ 匹配之前的项1次或者多次
* 匹配之前的项0次或者多次, .*
()  匹配表达式,创建一个用于匹配的子串 
{ n }  匹配之前的项n次,n是可以为0的正整数
{n,}     之前的项至少需要匹配n次
{n,m} 指定之前的项至少匹配n次,最多匹配m次,n<=m
交替匹配 两边的任意一项ab(c d)匹配abc或abd

2、特定字符

 
>[[:space:]]   空格
[[:digit:]]  [0-9]
[[:lower:]]  [a-z]
[[:upper:]]  [A-Z]
[[:alpha:]]   [a-Z]

3、sed文本处理及实战练习

sed是一个流编辑器, 非交互式的编辑器,它一次处理一行内容.
处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space)
接着用 sed 命令处理缓冲区中的内容,处理完成后, 把缓冲区的内容送往屏幕。
接着处理下一行,这样不断重复,直到文件末尾。
文件内容并没有改变,除非你 使用重定向存储输出。
Sed 要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

# 命令格式
sed [options] 'command' file(s)

# 正则使用
与 grep一样,sed 在文件中查找模式时也可以使用正则表达式(RE)和各种元字符。
正则表达式是括在斜杠间的模式,用于查找和替换,以下是sed支持的元字符。
使用基本元字符集 ^, $, ., *, [], [^], \< \>, \(\), \{\}
使用扩展元字符集 ?, +, { }, |, ( )
使用扩展元字符的方式  \+  sed -r

# sed选项参数
-e 允许多项编辑
-n 取消默认的输出
-i 直接修改对应文件
-r 支持扩展元字符

# sed内置命令参数
a  在当前行后添加一行或多行
c   在当前行进行替换修改
d   在当前行进行删除操作
i   在当前行之前插入文本
p   打印匹配的行或指定行
n   读入下一输入行,从下一条命令进行处理
!   对所选行以外的所有行应用命令
h   把模式空间里的内容重定向到暂存缓冲区
H   把模式空间里的内容追加到暂存缓冲区
g   取出暂存缓冲区的内容,将其复制到模式空间,覆盖该处原有内容
G   取出暂存缓冲区的内容,将其复制到模式空间,追加在原有内容后面

3.1、先删除行,然后管道给后面的sed进行替换

[root@Shell ~]# sed '1,9d' passwd |sed 's#root#alex#g'

3.2、使用-e进行多次编辑修改操作

[root@Shell ~]# sed -e '1,9d' -e 's#root#alex#g' passwd

3.3、打印命令p

3.3.1、打印匹配halt的行

[root@Shell ~]# sed -n  '/halt/p' passwd

3.3.2、打印第二行的内容

[root@Shell ~]# sed -n  '2p' passwd
bin:x:1:1:bin:/bin:/sbin/nologin

3.3.3、打印最后一行

[root@Shell ~]# sed -n  '$p' passwd

3.4、追加命令a

3.3.1、给30行添加配置 \t tab键(需要转义) \n 换行符

[root@Shell ~]# sed -i  '30a listen 80;' passwd

3.5、修改命令c

3.5.1、指定某行进行内容替换

[root@Shell ~]# sed  -i '7c SELINUX=Disabled' /etc/selinux/config

3.5.2、正则匹配对应内容, 然后进行替换

[root@Shell ~]# sed -i '/^SELINUX=/c SELINUX=Disabled' /etc/selinux/config

3.5.3、非交互式修改指定的配置文件

[root@Shell ~]# sed -ri '/UseDNS/cUseDNS no' /etc/ssh/sshd_config
[root@Shell ~]# sed -ri '/GSSAPIAuthentication/c#GSSAPIAuthentication no' /etc/ssh/sshd_config
[root@Shell ~]# sed -ri '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config

3.6、删除命令d

3.6.1、指定删除第三行, 但不会改变文件内容

[root@Shell ~]# sed '3d' passwd
[root@Shell ~]# sed '3{d}' passwd

3.6.2、从第三行删除到最后一行

[root@Shell ~]# sed '3,$d' passwd

3.6.3、删除最后一行

[root@Shell ~]# sed '$d' passwd

3.6.4、删除所有的行

[root@Shell ~]# sed '1,$d' passwd

3.6.5、匹配正则进行该行删除

[root@Shell ~]# sed /mail/d passwd

3.7、插入命令i

4.7.1、在文件的某一行上面添加内容

[root@Shell ~]# sed -i  '30i listen 80;' passwd

3.8、写文件命令w

3.8.1、将匹配到的行写入到新文件中

[root@Shell ~]# sed -n '/root/w newfile' passwd

3.8.2、将passwd文件的第二行写入到newfile中

[root@Shell ~]# sed -n '2w newfile' passwd

3.9、获取下一行命令n

3.9.1、匹配root的行, 删除root行的下一列

[root@Shell ~]# sed '/root/{n;d}' passwd

3.9.2、替换匹配root行的下一列

[root@Shell ~]# sed '/root/{n; s/bin/test/}' passwd

3.10、暂存和取用命令h H g G

3.10.1、将第一行的写入到暂存区, 替换最后一行的内容

[root@Shell ~]# sed  '1h;$g' /etc/hosts

3.10.2、将第一行的写入到暂存区, 在最后一行调用暂存区的内容

[root@Shell ~]# sed  '1h;$G' /etc/hosts

3.10.3、将第一行的内容删除但保留至暂存区, 在最后一行调用暂存区内容追加至于尾部

[root@Shell ~]# sed -r '1{h;d};$G' /etc/hosts

3.10.4、将第一行的内容写入至暂存区, 从第二行开始进行重定向替换

[root@Shell ~]# sed -r '1h;2,$g' /etc/hosts

3.10.5、将第一行重定向至暂存区, 2-3行追加至暂存区, 最后追加调用暂存区的内容

[root@Shell ~]# sed -r '1h; 2,3H; $G' /etc/hosts

3.11、反向选择命令!

3.11.1、除了第三行,其他全部删除

[root@Shell ~]# sed -r '3!d' /etc/hosts

3.12、sed匹配替换

s 替换命令标志
g 行内全局替换
i 忽略替换大小写
替换命令`s`

3.12.1、替换每行出现的第一个root

[root@Shell ~]# sed 's/root/alice/' passwd

3.12.2、替换以root开头的行

[root@Shell ~]# sed 's/^root/alice/' passwd

3.12.3、查找匹配到的行, 在匹配的行后面添加内容

[root@Shell ~]# sed -r 's/[0-9][0-9]$/& .5/' passwd

3.12.4、匹配包含有root的行进行替换

[root@Shell ~]# sed -r 's/root/alice/g' passwd

3.12.5、匹配包含有root的行进行替换,忽略大小写

# sed -r 's/root/alice/gi' /etc/passwd

3.12.6、将文件内容倒叙排序

[root@shell ~]# sed '1!G;h;$!d' passwd

3.12.6、后向引用

[root@Shell ~]# sed -r 's#(Roo)#\1-alice#g' passwd
[root@Shell ~]# ifconfig eth0|sed -n '2p'|sed -r 's#(^.*et) (.*) (net.*$)#\2#g'

# 示例文件内容如下:
[root@lzy ~]# vim a.txt
/etc/abc/456
etc

# 删除文本中的内容,需加转义
[root@Shell ~]# sed -r '\/etc\/abc\/456/d' a.txt

# 如果碰到/符号, 建议使用#符替换
[root@Shell ~]# sed -r 's#/etc/abc/456#/dev/null#g' a.txt
[root@Shell ~]# sed -r 's@/etc/abc/456@/dev/null@' a.txt

3.13、删除文件

3.13.1、删除配置文件中#号开头的注释行, 如果碰到tab或空格是无法删除

[root@Shell ~]# sed '/^#/d' file

3.13.2、删除配置文件中含有tab键的注释行

[root@Shell ~]# sed -r '/^[ \t]*#/d' file

3.13.3、删除无内容空行

[root@Shell ~]# sed -r '/^[ \t]*$/d' file

3.13.4、删除注释行及空行

[root@Shell ~]# sed -r '/^[ \t]*#/d; /^[ \t]*$/d' /etc/vsftpd/vsftpd.conf
[root@Shell ~]# sed -r '/^[ \t]*#|^[ \t]*$/d' /etc/vsftpd/vsftpd.conf
[root@Shell ~]# sed -r '/^[ \t]*($|#)/d' /etc/vsftpd/vsftpd.conf

3.14、给文件行添加注释 ⭐

3.14.1、将第二行到第六行加上注释信息

[root@Shell ~]# sed '2,6s/^/#/' passwd

3.14.2、将第二行到第六行最前面添加#注释符

[root@Shell ~]# sed -r '2,6s/.*/#&/' passwd

3.14.3、指定行添加注释

[root@shell ~]# sed -n '/nologin/s#^#\##gp' passwd 

[root@shell ~]# sed -n '/ntpdate/s/^/#/gp' /var/spool/cron/root

3.15、添加#注释符 ⭐

[root@Shell ~]# sed -r '3,$ s/^#*/#/' passwd
# sed -r '30,50s/^[ \t]*#*/#/' /etc/nginx.conf 
# sed -r '2,8s/^[ \t#]*/#/' /etc/nginx.conf

评论

还没有任何评论,你来说两句吧

提供支持 - 友情链接 - 衫小寨