一、前言:sed是什么?
sed(Stream Editor,流编辑器)是一个强大的文本处理工具,它能够通过脚本指令对文本文件进行高效的处理和编辑。sed主要用于自动化编辑一个或多个文件、简化重复性文件操作以及编写文本转换程序。
二、sed的工作原理
理解sed的工作原理至关重要,这直接影响操作结果的准确性。
数据处理流程:
读取:逐行读取文件内容到模式空间(pattern space)
执行:在模式空间中匹配条件并进行数据处理
输出:处理完成后将结果输出到屏幕
详细工作流程:
读取:sed从输入流(文件、管道或标准输入)读取一行内容到临时缓冲区(模式空间)
执行:默认情况下,所有sed命令在模式空间中顺序执行
显示:将修改后的内容发送到输出流,然后清空模式空间
重要提示:默认情况下sed不会直接修改原文件,除非使用重定向或-i
选项保存输出。
三、sed命令常见用法
基本语法:
bash
sed [选项] 操作 参数 sed [选项] -f scriptfile 参数
常用选项:
选项 | 含义 |
---|---|
-e |
进行多次编辑 |
-n |
取消默认输出 |
-f |
指定sed脚本文件 |
-i |
直接在源文件中修改 |
-r |
使用扩展正则表达式 |
常用操作命令:
命令 | 含义 |
---|---|
p |
打印输出 |
d |
删除指定行 |
i |
在指定行之前插入内容 |
a |
在指定行后面插入内容 |
c |
替换指定行所有内容 |
s |
搜索替换 |
四、实用示例演示
1. 输出符合条件的文本(p命令)
bash
sed -n 'p' demo # 输出所有内容,等同于cat sed -n '3p' demo # 输出第3行 sed -n '3,5p' demo # 输出3-5行 sed -n 'p;n' demo # 输出所有奇数行 sed -n 'n;p' demo # 输出所有偶数行 ifconfig ens33 | sed -n 2p # 直接显示第二行内容 # 正则表达式匹配 sed -n '/the/p' demo # 输出包含the的行 sed -n '/the/=' demo # 输出包含the的行号 sed -n '/[0-9]$/p' demo # 输出以数字结尾的行
2. 删除符合条件的文本(d命令)
bash
nl demo | sed '3d' # 删除第3行 nl demo | sed '3,5d' # 删除3-5行 nl demo | sed '/cross/d' # 删除包含cross的行 sed '/^$/d' demo # 删除所有空行
3. 替换符合条件的文本
bash
sed 's/the/THE/' demo # 每行第一个the替换为THE sed 's/1/L/2' demo # 每行第2个1替换为L sed 's/the/THE/g' demo # 所有the替换为THE sed 's/o//g' demo # 删除所有o字符 sed 's/^/#/' demo # 每行行首插入#号 sed 's/$/EOF/' demo # 每行行尾插入EOF sed '3,5s/the/THE/g' demo # 3-5行中所有the替换为THE # 直接修改配置文件 sed -i.bak 's/SELINUX=disabled/SELINUX=enable/' /etc/selinux/config
4. 迁移符合条件的文本
bash
sed '/the/{H;d};$G' demo # 包含the的行迁移至文件末尾 sed '1,5{H;d};17G' demo # 1-5行内容转移至第17行后 sed '/the/w out.file' demo # 包含the的行另存为文件 sed '/the/r /etc/hostname' demo # 将文件内容添加到包含the的行后 sed '3aNew' demo # 第3行后插入新行 sed '3aNew1\nNew2' demo # 第3行后插入多行内容
5. 使用脚本编辑文件
创建脚本文件opt.list
:
text
1,5H 1,5d 16G
执行脚本:
bash
sed -f opt.list demo
五、生产环境实用案例
案例1:修改网络配置
bash
# 将ens33接口IP修改为192.168.10.100 sed -i 's/^IPADDR=.*/IPADDR=192.168.10.100/' /etc/sysconfig/network-scripts/ifcfg-ens33
案例2:调整Apache配置
bash
# 修改监听地址和端口 sudo sed -i 's/Listen .*/Listen 192.168.10.100:8080/' /etc/httpd/conf/httpd.conf # 修改ServerName sed -i 's/^ServerName .*/ServerName 192.168.10.100:8080/' /etc/httpd/conf/httpd.conf
案例3:VSFTPD配置调整脚本
bash
#!/bin/bash SAMPLE="/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/vsftpd.conf" CONFIG="/etc/vsftpd/vsftpd.conf" # 备份配置文件 [ ! -e "$CONFIG.bak" ] && cp $CONFIG $CONFIG.bak # 调整配置 sed -e '/anonymous_enable/s/YES/NO/g' $SAMPLE > $CONFIG 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 # 重启服务 systemctl restart vsftpd systemctl enable vsftpd
六、高级技巧:分组操作
bash
# 分组替换 echo 123abcxyz | sed -r 's/(123)(abc)(xyz)/\1/' # 提取IP地址 ifconfig ens33 | sed -rn '2s/.*inet ([0-9.]+).*/\1/p' # 替换制表符和空格 sed -r 's/[[:space:]]+/#/g' /etc/hosts.bak
总结
sed是Linux系统中不可或缺的文本处理工具,通过掌握其基本用法和高级技巧,可以极大地提高文本处理效率。无论是简单的文本替换还是复杂的批量处理,sed都能提供优雅的解决方案。
使用sed的关键要点:
理解模式空间的概念
熟练使用正则表达式
掌握各种编辑命令的组合使用
在生产环境中使用前务必先备份
希望本文能帮助您更好地理解和运用sed这个强大的文本处理工具!