当前位置: 首页 > news >正文

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

一、前言: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这个强大的文本处理工具!

http://www.xdnf.cn/news/1440541.html

相关文章:

  • PHP如何解决使用国密SM4解密Base64数据错误问题?(基于lpilp/guomi)
  • 协议分析基础
  • 以技术共享点燃全球能源变革新引擎的智慧能源开源了
  • 低代码革命遇瓶颈?这个“套娃神技“才是破局关键!
  • 在Excel和WPS表格中隔多行插入一个空白行
  • 多场景对练数据的 Excel 横向导出方案(EasyExcel 动态表头实践)
  • 【XR硬件系列】Vivo Vision 与 Apple VisionPro 深度技术对比:MR 时代的轻量化革命与生态霸权
  • 单元测试数据库回滚问题
  • Android音频学习(十六)——CreateTrack
  • 资产管理还靠Excel?深度体验系统如何让企业高效数字化升级!
  • 自然语言处理深层语义分析中公理化体系的可行性、挑战与前沿进展
  • php:PHP 8 新特性深度解析与实战应用:提升开发效率的关键技巧
  • 为何 React JSX 循环需要使用 key
  • 一文弄懂C/C++不定参数底层原理
  • Zygote 进程启动流程
  • 视频判重需求:别为同一内容花两次钱!
  • 涨了一倍多的顺丰同城,还能继续做大即时零售基建的蛋糕吗?
  • HTML5 标题标签、段落、换行和水平线
  • 光谱相机的探测器类型
  • 相机在两个机械臂上安装方式比较
  • 字节跳动后端 一面凉经
  • 单片机:GPIO、按键、中断、定时器、蜂鸣器
  • 知微传感Dkam系列3D相机SDK例程篇:CSharp连接相机及保存数据
  • Debezium日常分享系列之:Debezium 3.3.0.Alpha2发布
  • Gemini CLI源码解析:Agent与上下文管理实现细节
  • Airsim 笔记:Python API 总结
  • ESXI8多网卡链路聚合
  • 渗透测试中的常见误区与最佳实践
  • 【LeetCode 热题 100】72. 编辑距离——(解法一)记忆化搜索
  • DBSCAN 密度聚类分析算法