[1. 输出符合条件的文本(p命令)](#1. 输出符合条件的文本(p命令))
[2. 删除符合条件的文本(d命令)](#2. 删除符合条件的文本(d命令))
[3. 替换符合条件的文本](#3. 替换符合条件的文本)
[4. 迁移符合条件的文本](#4. 迁移符合条件的文本)
[5. 使用脚本编辑文件](#5. 使用脚本编辑文件)
一、前言: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这个强大的文本处理工具!