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
1905

被折叠的 条评论
为什么被折叠?



