1、sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。
2、sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。
sed 的工作流程主要包括读取、执行和显示三个过程:
•读取:sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。
•执行:默认情况下,所有的sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed 命令 将会在所有的行上依次执行。
•显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
注意:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出。
常用选项
常用选项 | 命令解释 |
---|---|
-e | 表示用指定命今来处理输入的文本文件,只有一个操作命令时可省略,一般在执行多个操作命令使用 |
-f | 表示用指定的脚本文件来处理输入的文本文件 |
-h | 显示帮助。 |
-n | 禁止sed编辑器输出,但可以与p命令一起使用完成输出。 |
-i | 直接修改目标文本文件。 |
常用操作
s:替换,替换指定字符。
d:删除,删除选定的行。
a:增加,在当前行下面增加一行指定内容。
i:插入,在选定行上面插入一行指定内容。
c:替换,将选定行替换为指定内容。
y:字符转换,转换前后的字符长度必须相同。
p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以 ASCII 码输出。其通常与“-n”选项一起使用。
=:打印行号。
l(小写L):打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t)
sed -e '操作' 文件1 文件2
sed -n -e '操作' 文件1 文件2
sed -f 脚本文件 文件1 文件2
sed -i -e '操作' 文件1 文件2
1、打印文件里面的所有行内容
[root@dz666 ~]# sed -n 'p'test
one
two
three
four
five
six
seven
eight
nine
ten
eleven
twelve
2、打印文件里3到9行的内容
[root@dz666 ~]# sed -n '3,9p' test
three
four
five
six
seven
eight
nine
[root@dz666 ~]# sed -n '1,+4p' test
#1,+4p 意思是打印第一行和第一行之后连续的4行内容
one
two
three
four
five
[root@dz666 ~]# sed '5q' test
# 5q 意思是读取到第5行时退出该命令,只能从开头开始
one
two
three
four
five
3、使用=命令来查看这个文件的最后一行的行号
[root@dz666 ~]# cat test | sed -n '=' |tail -1
12
[root@dz666 ~]# cat test | wc -l
12 #使用wc -l 来查看最后一行的行号
4、使用l命令可以查看隐藏字符
[root@dz666 ~]# cat test | sed -n 'l'
one$
two$
three$
four$
five$
six$
seven$
eight$
nine$
ten$
eleven$
twelve$
5、使用-e可以执行多条命令
#sed命令会逐行读取内容,
#先使用第一条命令显示文件内容再去使用第二条命令
[root@dz666 ~]# cat test | sed -n -e '=' -e 'p'
#使用 -e 可以同时执行多个命令
#也可以使用
cat test | sed -n '=;p'
#效果跟上条命令一样
1
one
2
two
3
three
4
four
5
five
6
six
7
seven
8
eight
9
nine
10
ten
11
eleven
12
twelve
6、指定行号来打印指定行号的内容
[root@dz666 ~]# cat test | sed -n '$p'
# ’$p‘只显示最后一行内容
twelve
[root@dz666 ~]# cat test | sed -n '4p'
four
#显示第4行内容
[root@dz666 ~]# cat test | sed -n '9p'
nine
[root@dz666 ~]# cat test | sed -n '1p'
one
7、使用sed来显示奇数行和偶数行
[root@dz666 ~]# sed -n 'n;p' test
#在里面使用n命令不输出当前内容,执行到下一行内容
#偶数行
two
four
six
eight
ten
twelve
[root@dz666 ~]# sed -n 'p;n' test
#奇数行
one
three
five
seven
nine
eleven
8、打印指定文件里的字符串
[root@dz666 ~]# sed -n '/root/p' /etc/passwd
#打印所有//里面字符串在文件里的内容
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@dz666 ~]# sed -n '/^root/p' /etc/passwd
#加上^root 意思是以root为开头的行内容
root:x:0:0:root:/root:/bin/bash
[root@dz666 ~]# sed -n '/nologin$/p' /etc/passwd
#加上 nologin$ 意思是以nologin结尾的行内容
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@dz666 ~]# sed -n -r '/root|ftp/p' /etc/passwd
#使用正则表达式时要加上 -r
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
9、使用d命令来删除行内容
sed '行号 d' #删除指定行号的行
sed '行1 行2 d' #删除行1与行2区间的行
sed '/字符串/ d' #删除包含字符串的行
sed '/正则表达式/ p' #删除所有包含正则能够匹配的到内容的行
sed '行号,/字符串/ d' #删除从指定行到第一个包含字符串的行
sed '/字符串1/,/字符串2/ d'
#从第一个包含字符串1的行开始删除到第一个包含字符串2的行
#之后的行会重复之前的规则操作
行范围 s/旧字符串/新字符串/替换标记
1、4种替换标记
替换标记 | 解释 |
---|---|
数字 | 表明新字符串将替换第几处匹配的地方 |
g | 表明新字符串将会替换所有匹配的地方 |
p | 打印与替换命令匹配的行,与-n一起使用 |
w 文件 | 将替换的结果写到文件中 |
替换命令使用
[root@dz666 ~]# sed -n 's/root/admin/p' /etc/passwd
#直接写p意思是找到第一个root后替换为admin
admin:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/admin:/sbin/nologin
[root@dz666 ~]# sed -n 's/root/admin/2p' /etc/passwd
#2p 意思是替换第二个的root为admin
root:x:0:0:admin:/root:/bin/bash
[root@dz666 ~]# sed -n 's/root/admin/gp' /etc/passwd
#gp 意思是替换所有root为admin
admin:x:0:0:admin:/admin:/bin/bash
operator:x:11:0:operator:/admin:/sbin/nologin
[root@dz666 ~]# sed -n 's/root//gp' /etc/passwd
#在//里不写入字符,直接删除所有root字符
:x:0:0::/:/bin/bash
operator:x:11:0:operator:/:/sbin/nologin
[root@dz666 ~]# sed -n 's/^#//gp' test、
#注释所有#号
[root@dz666 ~]# sed -i -n 's/^#//gp' test
#建议先测试好之后在使用 -i 命令
#修改配置文件前要先备份
#加入-i 可以修改原文件
1、在开头插入#号
3、使用s来替换
[root@dz666 ~]# sed -n '/swap/ s/^/#/gp' /etc/fstab
#注释掉文件里有swap的行内容
#UUID=31b870c6-db09-424d-bfdd-20d7bbb54337 swap swap defaults 0 0
[root@dz666 ~]# sed -n '/^UUID/ s/^/#/gp' /etc/fstab
#注释掉所有以UUID开头的行内容
#UUID=5429c72d-e20c-4b24-bddc-2446d40ec8ba / xfs defaults 0 0
#UUID=0bc8a633-df1e-404d-a44c-2cdd57be56cb /boot xfs defaults 0 0
#UUID=31b870c6-db09-424d-bfdd-20d7bbb54337 swap swap defaults 0 0
[root@dz666 ~]# sed 's/.*swap.*/#&/' /etc/fstab
# &这个命令表示匹配前面执行命令的整行内容
# /etc/fstab
# Created by anaconda on Wed Mar 22 19:07:19 2023
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=5429c72d-e20c-4b24-bddc-2446d40ec8ba / xfs defaults 0 0
UUID=0bc8a633-df1e-404d-a44c-2cdd57be56cb /boot xfs defaults 0 0
#UUID=31b870c6-db09-424d-bfdd-20d7bbb54337 swap swap defaults 0 0
4、使用-f 加上脚本来执行命令
[root@dz666 ~]# vim dz #写入脚本文件
#把以root开头的行注释
/^root/ s/^/#/
#把ftp替换成mysed
s/ftp/mysed/g
#把以nologin为结尾的行删除
/nologin$/ d
[root@dz666 ~]# sed -f dz /etc/passwd
#执行的脚本文件里的命令
#root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
dikl:x:1000:1000:DikL:/home/dikl:/bin/bash
5、在s替换后面加的字符可以是任何字符
sed -n 's/\/bin\/bash/\/bin\/csh/p' /etc/passwd
sed -n 's!/bin/bash!/bin/csh!p' /etc/passwd #使用“!”作为字符串分隔符
sed -i 's9\945\9\99\98\939g' test.txt #将94599替换为9893
2、使所有的1字符转换成A,所有的4字符转换成B,所有的5字符转换成C
6、将1到3行的内容剪切到末尾,H表示复制到剪切板,G表示粘贴到指定行后
也可以复制多行内容
7、替换字符位置
[root@dz666 ~]# echo "111222333" | sed -r 's/(111)(222)/\2\1/'
#将字符 111 和 222 互换位置
222111333
[root@dz666 ~]# echo "111222333" | sed -r 's/^(.)(.*)(.)$/\3\2\1/'
311222331
#将第一个字符和最后一个字符互换