正则表达式与sed结合应用

正则表达式:

对文本内容进行过滤,查找,匹配,正则可以匹配完整的大小写


元字符

.:表示任意单个字符 ( .\. 转义,这个时候点代表的意思就是一个点)

\:转义符

():分组 \(\)

[]:匹配范围之内的任意单个字符

既可以匹配0-9.也可以匹配大小写的英文,包括一些符号

[^az] 取反,显示不包括的内容

[[:blank:]]:匹配空格,不是tab键的空格


基本正则表示次数:

*.匹配前面的字符任意次,包括0次,(有多少算多少,尽可能长的匹配)

.*. 匹配前面的字符任意次,但是不包括0次,也就是匹配所有

\?:匹配前面的字符出现0次或者1次 ,有且只有一次

\+:匹配前面出现的字符,至少得有一次,要>=1

\{n\}:匹配前面出现的字符等于几次

\{m.n\}:匹配前面出现的字符最少M次。最多是n数

\{,n}:匹配前面的字符最多n次

\{n,\}:匹配前面的字符最少n次 (只要连续出现N次,后面的都算)

通配符

匹配的是文件名,而且不能精确匹配大小写

在网站上输入账号密码不对,提示少了数字符号啥的

都是这个正则表达式来的

位置锚定

^:行首锚定,以什么为开头

$:行尾锚定,以什么为结尾

^root$:有行首有行位,写在一块的,这种叫匹配行模式 单独的一行只有root

[root@localhost opt]# cat 123.txt  
root rooot root
root root 
root
[root@localhost opt]# cat 123.txt  | grep "^root$"
root

^$:开头为空,也可以是空白行

^[[:space:]]*$:空白行

\<或者\b 词首锚定 用于匹配单词模式的左侧

从左往右全部都算。所有一切都包含,都匹配

\>或者\b 词尾锚定 用于匹配单词模式的右侧

只匹配右侧的单词,左侧的单词不匹配

[root@localhost opt]# echo hello-123 | grep "\b123"
hello-123
[root@localhost opt]# echo hello-123 | grep "\b-123"
hello-123
[root@localhost opt]# echo hello-123 | grep "\bo-123"
[root@localhost opt]# echo hello-123 | grep "\bhello"
hello-123

分组以及逻辑或

():分组

[root@localhost opt]# echo golgogle | grep '\(go\)\{1\}'
golgogle
[root@localhost opt]# echo golgogle | grep '\(go\)\{1\}gle'
golgogle

\ | :逻辑或

[root@localhost opt]# echo 1abc2abc | grep "\(1\|2\)abc"
1abc2abc

grep -E (扩展正则表达式) 不用带斜杠了

egrep

扩展正则表达式上面两个写法都可以用

[root@localhost opt]# cat 123.txt | grep -E "[0-9]{3,4}-[0-9]{8}"
025-83346023
0512-87766551
021-89988771
[root@localhost opt]# cat 123.txt | grep -E "[0-9a-zA-Z]+@[0-9a-z]+\.[a-z]+"
544564317@qq.com
CICIfireway@126.com
aaabbbccc@189.cn
[root@localhost opt]# cat 123.txt | grep -E "[0-9]{5,10}+@[q]{2}\.[com]+"
66606@qq.com
544677766@qq.com
544564317@qq.com
5555555555@qq.com

文本三剑客:grep 过滤文件内容 查

sed:行编辑器

sed也是按行来处理

sed是一种流编辑器

sed是一种流编辑器,每一次处理内容,只有确认才会生效,不确认的,只是把模式空间的临时数据展示给用户,然后删除

按照文本的行,一行一行的向下处理,知道文件的最后一行

默认情况下:sed都是在模式空间执行,因此元文件不会发生变化,要变化怎么办呢?


sed的操作格式

sed -e "操作 文件1 文件2 "

sed -e "操作1 ;操作2 " 文件

-e 指定的命令来处理输入的文本文件,如果只有一个操作,那么这个-e可以省略。多个指定才会用-e

-f 表示用脚本文件来处理输入的文件

-i 立即生效

-n 仅显示script处理后的结果

sed -i 立即生效 (慎用)

sed的操作符

p:打印

[root@localhost opt]# sed -e 'p' a.txt 
123
123
456
456
789
789
000
000
111
111
222
222
--------------------
sed自己还有一个默认输出,再加上P打印 所以有两行 
[root@localhost opt]# sed -n 'p' a.txt 
123
456
789
000
111
222
-------------------
加了-n就是禁止默认输出的意思,所以这里又变成了一行
[root@localhost opt]# sed -n '2p' a.txt   
456

打印指定行 
--------------------------
[root@localhost opt]# sed -n '=;p' a.txt 
1
123
2
456
3
789
4
000
5
111
6
222

上面这个是显示行号 
这个显示行号看起来很蛋疼吧(没有办法,他就是这么显示的)
------------------------
[root@localhost opt]# sed -n '$p' a.txt 
222
加上$,直接显示最后一行 
---------------------------
[root@localhost opt]# sed -n '1,3p' a.txt 
123
456
789
1,3p 意思就是现实1-3行 
---------------------------
[root@localhost opt]# sed -n '1p;3p' a.txt 
123
789

只显示1行与3行
打印偶数行
[root@localhost opt]# sed -n 'n;p' a.txt 
456
000
222


打印奇数行
[root@localhost opt]# sed -n 'p;n' a.txt 
123
789
111

n在p的前面。跳过当前一行,打印下一行 。 (偶数)

p在前,则打印当前一行跳过下一行继续打印 (奇数)


文本内容过滤

[root@localhost opt]# sed -n '/o/p'  b.txt 
one 
two
for

打印指定的过滤内容   用双斜杠括起来加p打印 

--------------
使用正则表达式来进行过滤 
[root@localhost opt]# cat /etc/passwd | sed -n '/bash$/p'
root:x:0:0:root:/root:/bin/bash
czy:x:1000:1000:CZY:/home/czy:/bin/bash
czy11:x:1001:1001::/home/czy11:/bin/bash
ab:x:1002:1002::/home/ab:/bin/bash
ac:x:1003:1003::/home/ac:/bin/bash
ad:x:1004:1004::/home/ad:/bin/bash

查找以bash结尾的所在行 
---------------------
[root@localhost opt]# cat /etc/passwd | sed -n '/^root/p'
root:x:0:0:root:/root:/bin/bash

查找以root为开头的所在行
从第四行开始,一直打印到第一个已bash为结尾的所在行 
[root@localhost opt]# sed -n '4,/bash$/p' /etc/passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
。
。
。
。
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
czy:x:1000:1000:CZY:/home/czy:/bin/bash

sed -r 使用扩展正则。{n}{n,}{n,m}{,m}

包含有两个99:的所在行 ,打印出来&#x20;


[root@localhost opt]# sed -nr '/(99:){2}/p' /etc/passwd
nobody:x:99:99:Nobody:/:/sbin/nologin


找出所有root开头还有以bash为结尾的行

[root@localhost opt]# sed -nr '/^root|bash$/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
czy:x:1000:1000:CZY:/home/czy:/bin/bash
czy11:x:1001:1001::/home/czy11:/bin/bash
ab:x:1002:1002::/home/ab:/bin/bash
ac:x:1003:1003::/home/ac:/bin/bash
ad:x:1004:1004::/home/ad:/bin/bash

  • 使用sed删除文件

现在有一个文件,文件名我想要保留,但是原有的内容我要删除掉

免交互删除

第一种

[root@localhost opt]# sed -i 'd' b.txt 
---------------------------------
[root@localhost opt]# cat /dev/null > b.txt 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

早上的星星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值