1.sed命令介绍
Linux sed 命令是利用脚本来处理文本文件,sed擅长行处理。
sed 可依照脚本的指令来处理、编辑文本文件。
Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等
sed命令是将一系列的编辑命令应用于一批文本的理想工具(文本三剑客之一),sed命令拥有非交互式和高效的特点,可以为用户节约大量时间。
sed命令是一个非交互式的文本编辑器,他可以对来自文本文件以及标准输入的文本进行编辑,其中标椎输入可以是来自键盘,文件重定向,字符串,变量或者是管道的输出的文本。sed命令会从文件或者标椎输出中一次读取一行数据,将其复制到缓冲区,然后读取命令行或者脚本的编辑子命令,对缓冲区中的文本进行编辑,一直重复此过程,直到所有文本文件都完毕。
2.sed的工作原理
sed的工作模式离不开两个空间,分别是模式空间(pattern space)和保留空间(holding space)。
2.1模式空间
sed在内存中开辟模式空间,处理文件的每个数入行,一次最多处理8192个字节,处理文件内容的内容,对输入行使用命令进行处理。
2.2保留空间
sed 在内存里开辟内存空间,保留已经处理过的输入行,最多为8192个字节。
2.3工作原理
(1)sed编辑器逐行处理文件,并将其结果输出在标准输出。
(2)sed命令将当前处理的行会读入到模式空间,进行处理(增,删,改,查…),处理完这一行后就会在模式空间中删除,然后读入下一行,读入模式空间,进行处理、显示。
(3)注:在临时缓冲区中(模式空间)对文件进行处理时,是不会对原文件进行修改的,除非sed命令指明添加-i选项。
(4)其中起辅助作用的是“holding space”,也叫暂存缓冲区,它的作用是实现模式空间内容的存放和读取。
3.sed的基本语法
用法: sed [选项]... {脚本(如果没有其他脚本)} [输入文件]...
3.1sed的常用参数
- -n: -quiet,不输出模式空间中的内容
例:[root@bogon ~]# sed 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=permissive
# SELINUXTYPE= can take one of these three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
[root@bogon ~]# sed -n 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
[root@bogon ~]#
- -i: 直接编辑原文件,sed命令不加此选项默认不对原文件进行修改
例:
[root@bogon ~]# sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
#会直接改变原文件
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=permissive
# SELINUXTYPE= can take one of these three values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
- -e: 可以使用多个命令进行操作
- -f: /path/from/sed_script:从指定的文本中读取处理脚本
- -r: 使用扩展正则表达式
4.地址定界
-
- (1)#: #为数字,指定要处理操作的行
[root@bogon ~]# sed -n '2p' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
[root@bogon ~]# sed -n '4p' /etc/passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
-
- (2)$: 表示最后一行,多个文件进行操作的时候,为最后一个文件的最后一行
[root@bogon ~]# sed -n '$p' /etc/passwd
chen:x:1000:1000::/home/chen:/bin/bash
-
- (3)/regexp/: 表示能够被regexp匹配到的行
[root@bogon ~]# sed -n '/root/ p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
-
- 注:在regexp可以使用正则表达式,使用正则表达式可以快速匹配到你想要的行
-
- (4)/regexp/I: 在匹配时忽略regexp表达式的字母的大小写
[root@bogon ~]# sed -n '/root/ Ip' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
-
- (5)%regexp%: 任何能够被regexp匹配到的行,换用%(用其他字符也可以,例如#,@等)为边界符号
[root@bogon ~]# sed -n '\%chen% Ip' /etc/passwd
chen:x:1000:1000::/home/chen:/bin/bash
-
- (6)addr1,addr2:指定范围内的所有的行
- 常用的地址定界表示方法:
-
(a) 0, /regexp/: 从起始行开始到第一次能够匹配regexp匹配到的行
[root@bogon ~]# sed -n '1,3 p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
-
(b)/regexp/,/regexp/: 被模式匹配到的行内的所有的行
[root@bogon ~]# sed -n '/root/,/daemon/ p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:65534:65534:Kernel Overflow User:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
systemd-coredump:x:999:997:systemd Core Dumper:/:/sbin/nologin
systemd-resolve:x:193:193:systemd Resolver:/:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
[root@bogon ~]#
-
- (7)addr1,+N: 指定行以及以后的N行
[root@bogon ~]# sed -n '/^root/,+2 p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
-
- (8)addr1,~N:指定行开始的N行
[root@bogon ~]# sed -n '/^root/,~2 p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
-
- (9)!取反
[root@bogon ~]# sed -n '3,$ ! p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@bogon ~]# sed -n '1,$ ! p' /etc/passwd
[root@bogon ~]# sed -n '2,$ ! p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
注意事项
1.如果没有指定地址,表示命令将应用于每一行
2.如果只有一个地址,表示命令将应用于这个地址匹配的所有行
3.如果指定了由逗号分隔的两个地址,表示命令应用于匹配第一地址和第二地址之间的行(包括这两行)
4.如果地址指定后面跟有感叹号,表示命令将应用于不匹配该地址的所有行
5.常用编辑命令
-
- (1)d: 删除匹配到的行
-
- (2)p: 打印模式空间中的内容
-
- (3)a: \text:append,表示在匹配到的行之后追加内容
[root@bogon ~]# sed '/^1/ a haha' haha
11
haha
21
311
4111
51111
611111
7111111
81111111
911111111
11
haha
21
311
4111
51111
611111
7111111
81111111
911111111
-
- (4)i: \text: insert,表示在匹配到的行之前追加内容
[root@bogon ~]# vim haha
11
21
311
4111
51111
611111
7111111
81111111
911111111
11
21
311
4111
51111
611111
7111111
81111111
911111111
[root@bogon ~]# sed '/^1/ i haha' haha
haha
11
21
311
4111
51111
611111
7111111
81111111
911111111
haha
11
21
311
4111
51111
611111
7111111
81111111
911111111
-
- (5)c: \text: change,表示在匹配到的行和给定的文本进行交换
[root@bogon ~]# sed '/^1/ c haha' haha
haha
21
311
4111
51111
611111
7111111
81111111
911111111
haha
21
311
4111
51111
611111
7111111
81111111
911111111
-
- (6)s: s/regexp/replaement/flages:查找替换,把text替换成regexp匹配到的内容
[root@bogon ~]# sed 's/311/haha/' haha
11
21
haha
4111
51111
611111
7111111
81111111
911111111
11
21
haha
4111
51111
611111
7111111
81111111
911111111
例:将文件的第一行的第一个1换成yyy
[root@bogon ~]# sed '1 s/1/yyy/' haha
yyy1
21
311
4111
51111
611111
7111111
81111111
911111111
11
21
311
4111
51111
611111
7111111
81111111
911111111
例:匹配文件的第一行的第二个1将它替换成yyy
[root@bogon ~]# sed '1 s/1/yyy/ 2' haha
1yyy
21
311
4111
51111
611111
7111111
81111111
911111111
11
21
311
4111
51111
611111
7111111
81111111
911111111
使用sed的替换实现删除匹配的内容
- 删除所有行的第一个11
[root@bogon ~]# sed 's/11//' haha
21
3
41
511
6111
71111
811111
9111111
21
3
41
511
6111
71111
811111
9111111
- 删除全部的11
[root@bogon ~]# sed 's/11//g' haha
21
3
41
5
61
7
81
9
21
3
41
5
61
7
81
9
- 删除第一行第二个1
[root@bogon ~]# sed 's/1//2' haha
1
21
31
411
5111
61111
711111
8111111
91111111
1
21
31
411
5111
61111
711111
8111111
91111111
- 删除每行的第一个数字
[root@bogon ~]# sed 's/^.//' haha
1
1
11
111
1111
11111
111111
1111111
11111111
1
1
11
111
1111
11111
111111
1111111
11111111
-
- (7)r: 读入文件内容追加到匹配行的后面
-
- (8)R: 读入文件一行内容追加到匹配行后面
-
注:常用的flag
- g: 全局替换,默认只替换第一个
- i: 不区分大小写
- p: 如果成功替换则打印

本文详细介绍了 Linux 下的 sed 命令,涵盖 sed 的基本概念、工作原理、语法及常用参数等内容。sed 是一款强大的文本处理工具,特别适用于批量编辑文件、简化重复任务等场景。
654

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



