理解sed命令
深入理解sed命令:Linux文本处理的瑞士军刀
- 前言
- 一、sed简介
- 二、sed工作原理
- 三、sed命令语法
- 3.1 常用选项
- 3.2 常用操作命令
- 四、sed实用示例
- 4.1 输出文本
- 4.2 删除文本
- 4.3 替换文本
- 4.4 迁移文本
- 五、生产实践案例
- 5.1 修改网络配置
- 5.2 调整Apache配置
- 5.3 配置vsftpd服务
- 六、高级技巧
- 6.1 分组操作
- 6.2 脚本文件方式
- 结语
前言
在Linux系统管理和日常开发中,文本处理是一项基础而重要的技能。sed(Stream EDitor)作为Linux三剑客之一,以其强大的文本处理能力著称。本文将全面介绍sed命令的工作原理、常见用法和生产实践案例,帮助读者掌握这一高效的文本处理工具。
一、sed简介
sed(Stream EDitor)是一种流式文本编辑器,它通过脚本指令来处理、编辑文本文件。主要用途包括:
- 自动编辑一个或多个文件
- 简化对文件的反复操作
- 编写转换程序等
二、sed工作原理
理解sed的工作原理对于正确使用它至关重要。sed的工作流程主要包括三个过程:
- 读取:从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区(模式空间)
- 执行:默认情况下,所有sed命令都在模式空间中顺序执行
- 显示:发送修改后的内容到输出流,然后清空模式空间
具体执行过程如下: - 读入新的一行内容到缓存空间
- 从操作指令中取出第一条指令,判断是否匹配pattern
- 不匹配则忽略后续命令,继续取下一条指令
- 匹配则执行编辑命令,完成后继续取下一条指令
- 所有指令应用后,输出缓存行内容
- 重复上述过程直到所有行处理完毕
注意:默认情况下sed不会直接修改原文件,除非使用重定向或-i选项。
三、sed命令语法
基本语法格式:
sed [选项] '操作' 参数
sed [选项] -f scriptfile 参数
3.1 常用选项
选项 | 含义 |
---|---|
-e | 进行多次编辑 |
-n | 取消默认输出 |
-f | 指定sed脚本文件 |
-i | 直接在源文件中修改 |
-r | 使用扩展正则表达式 |
3.2 常用操作命令
命令 | 含义 |
---|---|
p | 打印输出 |
d | 删除指定行 |
i | 在指定行前插入内容 |
a | 在指定行后插入内容 |
c | 替换指定行所有内容 |
s | 搜索替换 |
四、sed实用示例
4.1 输出文本
sed -n 'p' demo # 输出所有内容,等同于cat
sed -n '3p' demo # 输出第3行
sed -n '3,5p' demo # 输出3-5行
sed -n '/the/p' demo # 输出包含the的行
sed -n '/^PI/p' demo # 输出以PI开头的行
4.2 删除文本
sed '3d' demo # 删除第3行
sed '3,5d' demo # 删除3-5行
sed '/come/d' demo # 删除包含cross的行
sed '/^$/d' demo # 删除所有空行
4.3 替换文本
sed 's/the/THE/' demo # 每行第一个the替换为THE
sed 's/the/THE/g' demo # 所有the替换为THE
sed 's/$/EOF/' demo # 每行行尾插入EOF
sed -i.bak 's/SELINUX=disabled/SELINUX=enable/' /etc/selinux/config # 直接修改文件
4.4 迁移文本
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 '3aNew' demo # 第3行后插入新行
五、生产实践案例
5.1 修改网络配置
# 将ens33接口IP修改为192.168.10.100
sed -i 's/^IPADDR=.*/IPADDR=192.168.10.100/' /etc/sysconfig/network-scripts/ifcfg-ens33
5.2 调整Apache配置
# 修改监听地址和端口
sed -i 's/^Listen .*/Listen 192.168.10.100:8080/' /etc/httpd/conf/httpd.conf
sed -i 's/^ServerName .*/ServerName 192.168.10.100:8080/' /etc/httpd/conf/httpd.conf
5.3 配置vsftpd服务
#!/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
六、高级技巧
6.1 分组操作
# 对一行数据进行多次操作
sed '/root/{s/root/ROOT/;s/x/X/g}' /tmp/passwd
# 使用正则分组
echo 123abcxyz |sed -r 's/(123)(abc)(xyz)/\1/' # 只保留第一组(123)
# 提取IP地址
ifconfig ens33|sed -rn '2s/.*inet ([0-9.]+) .*/\1/p'
6.2 脚本文件方式
将多个编辑指令存放到文件中(每行一条),通过-f选项调用:
# opt.list内容:
1,5H
1,5d
16G
# 执行脚本
sed -f opt.list demo
结语
sed作为Linux下强大的流式文本编辑器,虽然学习曲线较陡,但一旦掌握,可以极大提高文本处理效率。本文从基本原理到常见用法,再到生产实践案例,全面介绍了sed的各个方面。建议读者结合实际需求多加练习,逐步掌握这一文本处理的瑞士军刀。记住,sed的强大之处在于它能够将复杂的文本处理任务自动化,从而节省大量时间和精力。