博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux正则表达式sed
阅读量:6403 次
发布时间:2019-06-23

本文共 6882 字,大约阅读时间需要 22 分钟。

sed、awk工具可以实现文本替换并且把替换的文本输出到屏幕上

sed和awk都是流式编辑器,是针对文档的行来操作的。sed通常用来替换操作。


示例的文本内容,以下操作根据此文本。

1
2
3
4
5
6
7
[root@yonglinux ~]
# 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
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

1、打印某一行

sed -n 'n'p filename 单引号内的n是一个数字,表示第几行;p也可以写到引号内;

示例,打印passwd第3-5行;

1
2
3
4
[root@yonglinux ~]
# 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

打印所有行

1
[root@yonglinux ~]
# sed -n '1,$'p /etc/passwd

打印某一行,并且要显示行号,需要和grep一起使用;

1
2
[root@localhost ~]
# grep -n '.*' test.txt | sed -n '1'p
1:rrt

2、打印包含某个字符串的行

字符串需要用/ /括起来;grep中的特殊符号^ $ . * 同样适用于sed中。

1
2
3
[root@yonglinux ~]
# sed -n '/root/'p /etc/passwd
root:x:0:0:root:
/root
:
/bin/bash
operator:x:11:0:operator:
/root
:
/sbin/nologin

打印包含/sbin/nologin的行,/需要进行脱意;

1
2
3
4
5
[root@yonglinux ~]
# 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的行;

1
2
3
4
5
6
7
8
9
[root@yonglinux ~]
# sed -n '/^d/'p test.txt 
daemon:x:2:2:daemon:
/sbin
:
/sbin/nologin
[root@yonglinux ~]
# sed -n '/in$/'p test.txt 
daemon:x:2:2:daemon:
/sbin
:
/sbin/nologin
[root@yonglinux ~]
# sed -n '/r..o/'p test.txt
rooooot:x:0:0
/roooooot
:
/bin/bash
[root@yonglinux ~]
# sed -n '/ooo*/'p test.txt
root:x:0:0:root:
/root
:
/bin/bash
rooooot:x:0:0
/roooooot
:
/bin/bash

3、-e可以实现多个行为

1
2
3
[root@yonglinux ~]
# sed -e '1'p -e '/111/'p -n test.txt 
rot:x:0:0:rot:
/rot
:
/bin/bash
11111111111111111111111111111111

可以用-e写多个;-e相当于传送带,先匹配最前面的打印,再匹配后面的打印,所以第一行会打印2次;

1
2
3
4
5
6
[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的前面或最后面;

1
2
3
4
5
6
[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/bash

4、删除某行或者多行

‘d’ 这个字符就是删除的动作了,不仅可以删除指定的单行以及多行,而且还可以删除匹配某个字符的行,另外还可以删除从某一行一直到文档末行。


示例,删除第一行;删除1-3行;删除包含root关键词的行;删除第3行到最后一行所有行;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@yonglinux ~]
# 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@yonglinux ~]
# sed '1,3'd test.txt 
rooooot:x:0:0
/roooooot
:
/bin/bash
11111111111111111111111111111111
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
[root@yonglinux ~]
# 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@yonglinux ~]
# sed '3,$'d test.txt 
rot:x:0:0:rot:
/rot
:
/bin/bash
root:x:0:0:root:
/root
:
/bin/bash

5、替换字符或替换字符串

示例,替换第一行字母r为R;替换1-2行中ot为to;替换所有行中ot为to;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@localhost ~]
# sed '1s/r/R/g' test.txt 
RRt
[root@yonglinux ~]
# 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@yonglinux ~]
# 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'

1
2
3
4
5
6
[root@yonglinux ~]
# 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

示例,删除文档中所有的字母

1
2
3
4
5
6
[root@yonglinux ~]
# sed 's/[a-z]//g' 1.txt 
::0:0:/:
//
::11:0::/:
//
::11:0::/:
//
::0:0:/:
//
1111111111111111111111111111111

示例,删除文档中不是英文字母的(数字和特殊符号)

1
2
3
4
5
6
[root@yonglinux ~]
# sed 's/[^a-z]//g' 1.txt 
rotxrotbinbash
operatorxoperatorrootsbinnologin
operatorxoperatorroootsbinnologin
rooootxroooootbinbash
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

示例,删除文档中不是数字的(英文字母和特殊符号)

1
2
3
4
5
6
[root@yonglinux ~]
# sed 's/[^0-9]//g' 1.txt 
00
110
110
00
1111111111111111111111111111111

示例,把文档中的小写字母全部替换为大写字母 's/[a-z]/\u&/g' 

1
2
3
4
5
6
7
[root@yonglinux ~]
# 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' 

1
2
3
4
5
6
7
[root@yonglinux ~]
# 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 打印特定的行;

1
2
[root@yonglinux ~]
# sed -n '1s/[a-z]/\u&/g'p 1.txt 
ROT:X:0:0:
/ROT
:
/BIN/BASH

6、调换二个字符串的位置

sed -r 's/([^:]+)(:.*:)([^:]+$)/\3\2\1/'

[^:]非冒号,不是冒号的所有字符

-r, --regexp-extended  在脚本中使用扩展正则表达式; 加r选项的意思为后面不用再加脱意\  

( )括号括起来是分段的意思,

\3\2\1    是代表3调换1,后面的内容调换到前面


示例,aa与ff调换;加-r选项不用加脱意符号\;不加-r ( )括号左右都需要加\脱意;调换多行用最后一个;

1
2
3
4
5
6
7
8
[root@localhost ~]
# cat 1.txt 
aa:bb:cc:
dd
:ee:ff
[root@localhost ~]
# sed -r 's/(aa)(.*)(ff)/\3\2\1/' 1.txt
ff:bb:cc:
dd
:ee:aa
[root@localhost ~]
# sed 's/\(aa\)\(.*\)\(ff\)/\3\2\1/' 1.txt 
ff:bb:cc:
dd
:ee:aa
[root@localhost ~]
# sed -r 's/([^:]+)(:.*:)([^:]+$)/\3\2\1/' 1.txt 
ff:bb:cc:
dd
:ee:aa

示例,rot与/bin/bash进行调换

1
2
3
4
5
6
7
8
[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\)/\3\2\1/'
/bin/bash
:x:0:0:rot:
/rot
:rot
[root@localhost ~]
# grep 'rot' test.txt |sed -r 's/(rot)(.*)(/bin/bash)/\3\2\1/'
sed
:-e 表达式 
#1,字符 18:“s”的未知选项
[root@localhost ~]
# grep 'rot' test.txt |sed -r 's/(rot)(.*)(\/bin\/bash)/\3\2\1/'
/bin/bash
:x:0:0:rot:
/rot
:rot

加-r  后()内的/bin/bash 也还需要脱意才可以;

-i 选项    直接替换字符,并且保存原文件里面。使用i选项前,记得备份原文件。

1
2
3
[root@localhost ~]
# sed -r -i 's/([^:]+)(:.*:)([^:]+$)/\3\2\1/' 1.txt 
[root@localhost ~]
# cat 1.txt 
ff:bb:cc:
dd
:ee:aa

本文转自 模范生 51CTO博客,原文链接:http://blog.51cto.com/mofansheng/1632293,如需转载请自行联系原作者

你可能感兴趣的文章
OC UIImage基础
查看>>
Android Studio NDK:二、JNI 返回JAVA 实体
查看>>
解析极限编程xp
查看>>
360小程序上线
查看>>
深入了解jquery中的ajax方法参数
查看>>
Java.awt & MFC消息处理机制
查看>>
【题解】P2154 [SDOI2009]虔诚的墓主人
查看>>
2.1.5 Python元类深刻理解(metaclass)
查看>>
计算机是学前端开发好还是后端开发好?
查看>>
Revel运行APP出现的路径问题
查看>>
bzoj 3545: [ONTAK2010]Peaks
查看>>
并发 - Go 语言学习笔记
查看>>
vb.net压缩access文件(.accdb)
查看>>
深度学习之激活函数表
查看>>
10.31T1 二分图
查看>>
轻松精通数据库管理之道——运维巡检之三(结构设计)
查看>>
Vue.js——60分钟组件快速入门(上篇)
查看>>
Linux常用命令之rpm安装命令
查看>>
Eclipse插件:tomcatPluginV33.zip 安装
查看>>
WLC5520数据口使用千兆模块注意事项
查看>>