深入掌握sed:Linux文本处理的流式编辑器利器

发布于:2025-09-04 ⋅ 阅读:(22) ⋅ 点赞:(0)

一、前言:sed是什么?

二、sed的工作原理

数据处理流程:

详细工作流程:

三、sed命令常见用法

基本语法:

常用选项:

常用操作命令:

四、实用示例演示

1. 输出符合条件的文本(p命令)

2. 删除符合条件的文本(d命令)

3. 替换符合条件的文本

4. 迁移符合条件的文本

5. 使用脚本编辑文件

五、生产环境实用案例

案例1:修改网络配置

案例2:调整Apache配置

案例3:VSFTPD配置调整脚本

六、高级技巧:分组操作

总结

一、前言:sed是什么?

sed(Stream Editor,流编辑器)是一个强大的文本处理工具,它能够通过脚本指令对文本文件进行高效的处理和编辑。sed主要用于自动化编辑一个或多个文件、简化重复性文件操作以及编写文本转换程序。

二、sed的工作原理

理解sed的工作原理至关重要,这直接影响操作结果的准确性。

数据处理流程:

  1. 读取:逐行读取文件内容到模式空间(pattern space)

  2. 执行:在模式空间中匹配条件并进行数据处理

  3. 输出:处理完成后将结果输出到屏幕

详细工作流程:

  • 读取: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这个强大的文本处理工具!


网站公告

今日签到

点亮在社区的每一天
去签到