Shell编程之Sed

目录

一.Sed编辑器

1.1Sed工具概述

1.2Sed的工作原理

1.3Sed格式的基本用法

1.4Sed常用选项

1.5sed命令的常用操作

2.Sed用法示例

2.1sed输出指定的行

2.2输出奇数和偶数行

3.Sed结合正则表达式输出指定行

3.1插入符合条件的行

3.2 删除符合条件的行

4.替换符合条件的文本

4.1字符串替换

 4.2先备份再修改数据

5.迁移符合条件的文本

5.1常用参数

 6.使用脚本编辑文件

 7.Sed的应用案例

 7.1调整vsftpd服务配置

 7.2修改DNS配置文件

 7.2.1修改主配置文件

 7.2.2修改区域配置文件

 7.2.3修改区域数据配置文件

 八.总结 


一.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的基本语法以及一些用法示例,还包括一些应用案例。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值