正则表达式sed学习

Posted xmtxh

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式sed学习相关的知识,希望对你有一定的参考价值。

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

sed 增加 修改 查找 删除 增删改查

#查
sed单行查询
sed多行查询(地址范围)
sed过滤功能

#增
sed单行增加
sed多行增加
sed增加案例

#删
sed删除功能及案例

#改
sed文本替换
sed变量替换
sed反向引用
sed替换案例
sed执行多条语句
获取文件行号


1.sed语法格式

sed [选项] [sed指令] [输入文件]

 

2.sed命令执行流程

技术图片

 

3.创建测试文件

cat >person.txt<<EOF
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
EOF

 

4.查询单行文本p 显示某一行

p  sed指定,打印模式空间内容
-n sed选项,取消默认输出

[root@xiaoming ~]# sed 1p person.txt 
101,oldboy,CEO
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO

[root@xiaoming ~]# sed 1p person.txt -n
101,oldboy,CEO
#显示文件最后一行
[root@xiaoming ~]# sed $p person.txt -n
105,feixue,CIO

 

5.查询连续多行文本,显示连续的多行,从哪里来到哪里去‘1,4p‘

指定p前面没有地址范围,那么默认匹配所有行

#数字地址范围--推荐 行号
#2,4 显示第二行到第四行的内容,包含第二行和第四行

[root@xiaoming ~]# sed 2,4p person.txt -n
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO


##正则地址范围-模糊,容易找多了
[root@xiaoming ~]# sed -n /oldboy/p person.txt 
101,oldboy,CEO
[root@xiaoming ~]# sed -n /o.*y/p person.txt 
101,oldboy,CEO
[root@xiaoming ~]# sed -n /o.*y/,/105/p person.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO


##显示这个文件的第一行到第四行
[root@xiaoming ~]# sed -n 1,4p person.txt 

##从包含101的这一行,显示到包含104的这一行
[root@xiaoming ~]# sed -n /101/,/104/p person.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO

 

sed查询功能对比grep
1.都是基于行为单位
2.都支持正则
3.sed可以做指定查询范围,grep不行


6.过滤多个字符串

-r sed选项,支持扩展正则表达式(|())

默认情况,sed只支持基本正则表达式。
[root@xiaoming ~]# egrep oldboy|yy person.txt 
101,oldboy,CEO
104,yy,CFO

[root@xiaoming ~]# sed -rn /oldboy|yy/p person.txt 
101,oldboy,CEO
104,yy,CFO

sed里面的正则字符左右必须有"/"。/oldboy/

重点:
sed 查询单行文本
查询多行文本 使用数字地址范围sed 2,4p person.txt -n

 

7.查询指定多行
使用分号

[root@xiaoming ~]# sed -n 1p;3p;5p person.txt 
101,oldboy,CEO
103,Alex,COO
105,feixue,CIO

 

8.增加单行文本a,i

我想向person.txt文件中追加2行
106,lidao,UFO
107,bingbing,CEO
方法一:cat
cat >>person.txt <<EOF
106,lidao,UFO
107,bingbing,CEO
EOF

方法二:echo
[root@xiaoming ~]# echo "asda
> asdas
> asdas"
asda
asdas
asdas

[root@xiaoming ~]# echo "106,lidao,UFO
107,bingbing,CEO"
106,lidao,UFO
107,bingbing,CEO person.txt
[root@xiaoming ~]# echo -e "106,lidao,UFO
107,bingbing,CEO" 
106,lidao,UFO
107,bingbing,CEO person.txt
方法三:sed命令
#在第2行后面加入一个新行,内容为 oldboy.com
[root@xiaoming ~]# sed 2a oldboy.com person.txt 
101,oldboy,CEO
102,zhangyao,CTO
oldboy.com
103,Alex,COO

[root@xiaoming ~]# sed 2i oldboy.com person.txt 
101,oldboy,CEO
oldboy.com
102,zhangyao,CTO

a  append 追加
i  insert 插入
#在最后一行后面追加2行内容
[root@xiaoming ~]# sed $a 106,lidao,UFO
107,bingbing,CEO person.txt 
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
106,lidao,UFO
107,bingbing,CEO

 

9.删除文件内容d

d sed指令,删除文本内容
$ 代表文件最后一行

#删除第一行
[root@xiaoming ~]# sed 1d person.txt 
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO
106,lidao,UFO
107,bingbing,CEO
#显示文件内容但不包含第一行
方法一:
[root@xiaoming ~]# grep -v oldboy person.txt

方法二:
[root@xiaoming ~]# sed /oldboy/d person.txt

方法三:
[root@xiaoming ~]# awk !/oldboy/ person.txt

 

10.修改文件内容c

禁用SELINUX
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
sed -i "7c SELINU=disabledX" /etc/selinux/config
sed -i "/^SELINU=/ SELINU=disabledX" /etc/selinux/config

 

11.文本替换

s/old/new/g
s@@@g
s###g

s//etc/hosts//etc/hosts.bak/g
s#/etc/hosts#/etc/hosts.bak#/g

[root@xiaoming ~]# cat person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
105,feixue,CIO

[root@xiaoming ~]# sed s#[0-9]#oldboy#g person.txt
oldboyoldboyoldboy,oldboy,CEO
oldboyoldboyoldboy,zhangyao,CTO
oldboyoldboyoldboy,Alex,COO
oldboyoldboyoldboy,yy,CFO
oldboyoldboyoldboy,feixue,CIO

[root@xiaoming ~]# sed s#[0-9]##g person.txt
,oldboy,CEO
,zhangyao,CTO
,Alex,COO
,yy,CFO
,feixue,CIO

 

案例:随机取出10位连续小写字符的字符串

openssl rand -base64 123 | sed s#[^a-z]##g| head -c 10
###-i 自动备份功能,先备份,在修改文件内容
[root@xiaoming ~]# sed -ri.bak s#[0-9]#oldboy# person.txt
[root@xiaoming ~]# ll 
总用量 24
-rw-r--r-- 1 root root  137 1月   7 22:14 person.txt
-rw-r--r-- 1 root root  102 1月   7 21:22 person.txt.bak

以上是关于正则表达式sed学习的主要内容,如果未能解决你的问题,请参考以下文章

Linux学习(二十五)正则表达式awk

Linux学习—sed

Shell 学习:正则表达式

Shell 学习:正则表达式

Shell 学习:正则表达式

在 grep 和 sed 中正确使用正则表达式开关