目录
一.Sed编辑器
1.1Sed工具概述
1.文本处理工具,读取文本内容,根据指定的条件进行处理,如删除,替换,添加等
2.可在无交互的情况下实现相当复杂的文本处理操作
3.被广泛应用于Shell脚本,以完成自动化处理任务
4.sed依赖于正则表达式
1.2Sed的工作原理
Sed工作流程包含了
读取;sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)
执行:默认情况下,所有的 sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则 sed 命令将会在所有的行上依次执行。
显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。
在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。
原理:将文件里的内容逐行取出放进模式空间,在模式空间里匹配条件进行数据处理,处理完了以后再从模式空间中取出数据输出到屏幕。
1.3Sed格式的基本用法
1.sed -e ‘编辑指令’ 文件1 文件2.。。
2.sed -n -e '编辑指令' 文件1 文件2.。。
3.sed -f 脚本文件 文件1 文件2.。。
4.sed -i -e ‘编辑指令’ 文件1 文件2.。。
1.4Sed常用选项
命令选项 | 命令意义 |
-e 或--expression | 表示用指定命令或者脚本来处理输入的文本文件。 |
-f 或--file | 表示用指定的脚本文件来处理输入的文本文件。 |
-h 或--help | 显示帮助。 |
-n、--quiet 或 silent | 表示仅显示处理后的结果。 |
-i.bak | 直接编辑文本文件。 |
-r, -E | 使用扩展正则表达式 |
-s | 将多个文件视为独立文件,而不是单个连续的长文件流 |
1.5sed命令的常用操作
sed命令 | 命令意义 |
a | 增加,在当前行下面增加一行指定内容。 |
c | 替换,将选定行替换为指定内容。 |
d | 删除,删除选定的行。 |
i | 插入,在选定行上面插入一行指定内容。 |
p | 打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以 ASCII 码输出。其通常与“-n”选项一起使用。 |
s | 替换,替换指定字符。 |
y | 字符转换。 |
2.Sed用法示例
2.1sed输出指定的行
sed -n 'p' passwd.txt //输出所有内容,等同于 cat test.txt
sed -n '3p' passwd.txt //输出第 3 行
sed -n '3,5p' passwd.txt //输出 3~5 行
sed -n 'p;n' passwd.txt //输出所有奇数行,n 表示读入下一行资料
sed -n 'n;p' passwd.txt //输出所有偶数行,n 表示读入下一行资料
sed -n '1,5{p;n}' passwd.txt //输出第 1~5 行之间的奇数行(第 1、3、5 行)
sed -n '10,${n;p}' passwd.txt //输出第 10 行至文件尾之间的偶数行
sed -n '2,+3p' passwd.txt //从第2行开始,连续3行进行输出,即输出2~5行
2.2输出奇数和偶数行
3.Sed结合正则表达式输出指定行
sed 命令结合正则表达式时,格式略有不同,正则表达式以“/”包围。
注:如果遇到特殊符号的情况,扩展正则还需要转义字符“\”。
sed -n '/the/p' text.txt //输出包含the 的行
sed -n '2,/the/p' text.txt //输出从第 4 行至第一个包含 the 的行
sed -n '/the/=' text.txt //输出包含the 的行所在的行号,等号(=)用来输出行号
sed -n '/^PI/p' text.txt //输出以PI 开头的行
sed -n '/[0-9]$/p' text.txt //输出以数字结尾的行
sed -n '/\<wood\>/p' text.txt //输出包含单词wood 的行
3.1插入符合条件的行
使用插入时,如果添加多行数据,除最后一行外,每行末尾都需要用“\n”符号表示数据未完结,换行。
sed '/the/i liunan yyds' text.txt //在含有the行的前面一行添加有手就行
sed '/the/a liunan yyds' text.txt //在含有the行的下一行添加有手就行
sed 'liunan yyds' text.txt //在第4行之后插入字符
3.2 删除符合条件的行
nl命令用于计算文件的行数,结合该命令可以更加直观地查看到命令执行的结果。
nl text.txt | sed '3d' //删除第3行
nl text.txt | sed '3,5d' //删除第3~5行
nl text.txt |sed '/cross/d' //删除包含 cross 的行,原本的第 8 行被删除;如果要删除不包含 cross 的行,用!符号表示取反操作, 如'/cross/!d'
sed '/^[a-z]/d' text.txt //删除以小写字母开头的行
sed '/\.$/d' text.txt //删除以.结尾的行
删除包含 cross 的行,原本的第 8 行被删除;如果要删除不包含 cross 的行,用!符号表示取反操作, 如’/cross/!d’
4.替换符合条件的文本
4.1字符串替换
sed 's/the/THE/' text.txt //将每行中的第一个the 替换为 THE
sed 's/l/L/2' text.txt //将每行中的第 2 个 l 替换为 L
sed 's/the/THE/g' text.txt //将文件中的所有the 替换为 THE
sed 's/o//g' text.txt //将文件中的所有o 删除(替换为空串)
sed 's/^/#/' text.txt //在每行行首插入#号
sed '/the/s/^/#/' text.txt //在包含the 的每行行首插入#号
sed '3,5s/the/THE/g' text.txt //将第 3~5 行中的所有 the 替换为 THE
sed '/the/s/o/O/g' text.txt //将包含the 的所有行中的 o 都替换为 O
4.2先备份再修改数据
5.迁移符合条件的文本
5.1常用参数
H:复制到剪贴板;
g、G:将剪贴板中的数据覆盖/追加至指定行;
w:保存为文件;
r:读取指定文件;
a:追加指定内容。具体操作方法如下所示。
I,i 忽略大小写
sed '/the/{H;d};$G' text.txt //将包含the 的行迁移至文件末尾,{;}用于多个操作
sed '1,5{H;d};14G' text.txt //将第 1~5 行内容转移至第 17 行后
sed '/the/w out.file' text.txt //将包含the 的行另存为文件 out.file
sed '/the/r /etc/hostname' text.txt //将文件/etc/hostname 的内容添加到包含 the 的每行以后
sed '3aNew' text.txt //在第 3 行后插入一个新行,内容为New
sed '/the/aNew' text.txt //在包含the 的每行后插入一个新行,内容为 New
sed '3aNew1\nNew2' text.txt //在第 3 行后插入多行内容,中间的\n 表示换行
把包含the的行复制到行尾,并删除行
H复制,d删除
{H;d}先复制,再删除
6.使用脚本编辑文件
使用 sed 脚本将多个编辑指令存放到文件中(每行一条编辑指令),通过“-f”选项来调用。
例如执行以下命令即可将第 1~5 行内容转移至第 14 行后,等同于sed ‘1,5{H;d};16G’ text.txt
7.Sed的应用案例
7.1调整vsftpd服务配置
调整 vsftpd 服务配置,要求禁止匿名用户,但允许本地用户(也允许写入)。
#!/bin/bash
# 指定样本文件路径、配置文件路径
SAMPLE="/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/vsftpd.conf "
CONFIG="/etc/vsftpd/vsftpd.conf"
# 备份原来的配置文件,检测文件名为/etc/vsftpd/vsftpd.conf.bak 备份文件是否存在, 若不
存在则使用 cp 命令进行文件备份
[ ! -e "$CONFIG.bak" ] && cp $CONFIG $CONFIG.bak
# 把以anonymous_enable开头的行YES全部替换成NO,覆盖现有文件
sed -e '/^anonymous_enable/s/YES/NO/g' $SAMPLE > $CONFIG
# 把以local_enable和write_enable开头的行,NO全部替换成YES
sed -i -e '/^local_enable/s/NO/YES/g' -e '/^write_enable/s/NO/YES/g' $CONFIG
grep "listen" $CONFIG || sed -i '$alisten=YES' $CONFIG
# 启动vsftpd 服务,并设为开机后自动运行
systemctl restart vsftpd systemctl enable vsftpd
7.2修改DNS配置文件
7.2.1修改主配置文件
修改前:
修改后
7.2.2修改区域配置文件
全局更改,配置文件中所有zhangbin.com.zone全部改成liuyan.com.zone
对比一下:
局部更改,指定行数修改,避免出现错误
7.2.3修改区域数据配置文件
八.总结
本文介绍了Sed的基本语法以及一些用法示例,还包括一些应用案例。