高级玩法,不进入文件内部来编辑文件sed

sed(Stream Editor)是一个强大的流式文本编辑器,可在不进入文件内部的情况下对文本进行高效处理,
常用于文本替换、删除、插入等操作。 

#基本语法
sed [选项] '脚本' 文件

1.选项
sed 命令有多个选项,用于控制其行为,下面是一些常用选项:
-n:只输出经过处理的行,默认情况下 sed 会输出所有行。
-e:允许多个脚本指令,例如 sed -e '脚本1' -e '脚本2' 文件。
-i:直接修改文件内容,而不是输出到标准输出。
注意:sed的所有操作默认不会真正的执行,而是假装运行。但是如果加上-i参数,那就是真正的操作,真正的
修改。  

2.脚本
由地址和命令组成,用于指定要处理的行和具体操作。
(1)地址用于指定要处理的行,有以下几种常见形式:
①数字:指定具体的行号,例如 3 表示第 3 行。
②范围:用逗号分隔两个数字表示行的范围,如 3,5 表示第 3 行到第 5 行。
③正则表达式:用 /正则表达式/ 表示匹配该正则表达式的行,例如 /hello/ 表示匹配包含 hello 的行。


(2)命令包括打印命令p,插入命令i,追加命令a,删除命令d,修改命令c,替换命令s

3.文件
要处理的文本文件,若省略文件参数,sed 会从标准输入读取数据。

#sed示例
[root@xzq-almalinux ~]# cat file1
1 linux
2 Linux
3 LINUX
4 error
5 cat
6 .*
7 dog
8 keyword
9 python
10 warning
11 Warning
12 function
13 test
14 testing

1.打印命令
#打印第3行
[root@xzq-almalinux ~]# sed -n '3p' file1
3 LINUX 


#打印第3行到第5行
[root@xzq-almalinux ~]# sed -n '3,5p' file1
3 LINUX
4 error
5 cat 


#打印包含ing的行
[root@xzq-almalinux ~]# sed -n '/ing/p' file1
10 warning
11 Warning
14 testing


#sed输出第3行到行尾
[root@xzq-almalinux ~]# sed -n '3,$p' file1
3 LINUX
4 error
5 cat
6 .*
7 dog
8 keyword
9 python
10 warning
11 Warning
12 function
13 test
14 testing 


2.插入命令和追加命令(增加一行)
# 在第 3 行之前插入 glshenshuai 
[root@xzq-almalinux ~]# sed '3i glsshenshuai' file1
1 linux
2 Linux
glsshenshuai
3 LINUX
4 error
5 cat
6 .*
7 dog
8 keyword
9 python
10 warning
11 Warning
12 function
13 test
14 testing


# 在第 3 行之后插入 glshenshuai
[root@xzq-almalinux ~]# sed '3a glsshenshuai' file1
1 linux
2 Linux
3 LINUX
glsshenshuai
4 error
5 cat
6 .*
7 dog
8 keyword
9 python
10 warning
11 Warning
12 function
13 test
14 testing


 #正则表达式匹配function,在之后插入glshenshuai
[root@xzq-almalinux ~]# sed '/function/a glsshenshuai' file1
1 linux
2 Linux
3 LINUX
4 error
5 cat
6 .*
7 dog
8 keyword
9 python
10 warning
11 Warning
12 function
glsshenshuai
13 test
14 testing 

3.修改命令(直接改动某一行)
# 将第 3 行替换为 glshenshuai[root@xzq-almalinux ~]# sed '3c glsshenshuai' file1
1 linux
2 Linux
glsshenshuai
4 error
5 cat
6 .*
7 dog
8 keyword
9 python
10 warning
11 Warning
12 function
13 test
14 testing

#正则表达式匹配带ing的行,都换成glshenshuai
[root@xzq-almalinux ~]# sed '/ing/c glshenshuai' file1
1 linux
2 Linux
3 LINUX
4 error
5 cat
6 .*
7 dog
8 keyword
9 python
glshenshuai
glshenshuai
12 function
13 test
glshenshuai

#匹配到以1开头的内容,都换成glshenshuai
[root@xzq-almalinux ~]# sed '/^1/c glshenshuai' file1
glshenshuai
2 Linux
3 LINUX
4 error
5 cat
6 .*
7 dog
8 keyword
9 python
glshenshuai
glshenshuai
glshenshuai
glshenshuai
glshenshuai

4.删除命令
# 删除第 3 行
[root@xzq-almalinux ~]# sed '3d' file1
1 linux
2 Linux
4 error
5 cat
6 .*
7 dog
8 keyword
9 python
10 warning
11 Warning
12 function
13 test
14 testing 


# 删除第 3 行到第 5 行
[root@xzq-almalinux ~]# sed '3,5d' file1
1 linux
2 Linux
6 .*
7 dog
8 keyword
9 python
10 warning
11 Warning
12 function
13 test
14 testing


# 删除包含带有ing的行
[root@xzq-almalinux ~]# sed '/ing/d' file1
1 linux
2 Linux
3 LINUX
4 error
5 cat
6 .*
7 dog
8 keyword
9 python
12 function
13 test

5.替换命令
# 将每行的第一个 python 替换为 glshenshuai 
[root@xzq-almalinux ~]# sed 's/python/glshenshuai/' file1
1 linux
2 Linux
3 LINUX
4 error
5 cat
6 .*
7 dog
8 keyword
9 glshenshuai
10 warning
11 Warning
12 function
13 test
14 testing


# 将每行的所有 o 替换为 0
[root@xzq-almalinux ~]# sed 's/o/0/g' file1
1 linux
2 Linux
3 LINUX
4 err0r
5 cat
6 .*
7 d0g
8 keyw0rd
9 pyth0n
10 warning
11 Warning
12 functi0n
13 test
14 testing


[root@xzq-almalinux ~]# cat ip_address.txt 
1.1.1.1/24
2.2.2.2/24
3.3.3.3/24
4.4.4.4/24

#将ip_address.txt文件中的2.2.2.2/24替换成5.5.5.5/25
[root@xzq-almalinux ~]# sed 's/4.4.4.4\/24/5.5.5.5\/25/' ip_address.txt 
1.1.1.1/24
2.2.2.2/24
3.3.3.3/24
5.5.5.5/25


[root@xzq-almalinux ~]# sed 's#4.4.4.4/24#5.5.5.5/25#' ip_address.txt 
1.1.1.1/24
2.2.2.2/24
3.3.3.3/24
5.5.5.5/25

#只替换第 3 行到第 5 行的 error 为 glshenshuai 
[root@xzq-almalinux ~]# sed '3,5s/error/glshenshuai/' file1
1 linux
2 Linux
3 LINUX
4 glshenshuai
5 cat
6 .*
7 dog
8 keyword
9 python
10 warning
11 Warning
12 function
13 test
14 testing


6.引用变量
old="error"
new="glshenshuai" 
[root@xzq-almalinux ~]# sed  's/$old/$new/g' file1
1 linux
2 Linux
3 LINUX
4 error
5 cat
6 .*
7 dog
8 keyword
9 python
10 warning
11 Warning
12 function
13 test
14 testing 

单引号 ' 会阻止 shell 解析变量,所以应该用双引号 " 包裹命令,让 $old 被正确解析为变量值
# 双引号允许shell解析$old $new变量
[root@xzq-almalinux ~]# sed  "s/$old/$new/g" file1
1 linux
2 Linux
3 LINUX
4 glshenshuai
5 cat
6 .*
7 dog
8 keyword
9 python
10 warning
11 Warning
12 function
13 test
14 testing

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值