⚙️ 一、Sed简介

Sed(Stream Editor) 是Linux/Unix系统中的流式文本编辑器,以非交互方式逐行处理文本,执行查找、替换、删除、插入等操作。其核心特点是高效处理大文件,通过模式空间(Pattern Space)缓存当前处理行,编辑后输出结果,不直接修改源文件(除非使用 -i 选项)


🛠️ 二、核心功能与语法

1.常用选项

选项作用
-n抑制默认输出,仅打印处理过的行(常与 p 命令联用)
-e执行多条命令(例:sed -e 's/a/b/' -e 's/c/d/'
-i[.bak]直接修改源文件(.bak 为备份后缀)
-r启用扩展正则表达式(支持 +? 等元字符)
-f从文件读取脚本命令

2. 地址范围控制

通过行号或正则表达式限定操作范围:

  • 单行sed '5s/old/new/'(仅第5行替换)
  • 行区间sed '1,10d'(删除1-10行)
  • 模式匹配sed '/error/d'(删除含"error"的行)
  • 混合定位sed '/start/,/end/s/old/new/'(匹配startend的行替换)

⚡️ 三、常用操作命令

1. 替换文本(s 命令)

sed 's/原文本/新文本/[标志]' 文件
  • 标志
    • g:全局替换(默认仅替换每行首个匹配)
    • p:打印替换后的行(需配合 -n
    • 数字:替换第N个匹配(例:s/apple/orange/2 替换每行第二个"apple")
# 将所有"apple"替换为"orange"并保存原文件备份
sed -i.bak 's/apple/orange/g' fruits.txt

2. 删除行(d 命令)

# 删除空行
sed '/^$/d' file.txt  
# 删除注释行(以#开头)
sed '/^#/d' config.ini  
# 删除第3行
sed '3d' log.txt 

3. 插入与追加文本

  • 插入(i\:在指定行前添加
  • 追加(a\:在指定行后添加
# 在第2行前插入
sed '2i\插入内容' file.txt  
# 在含"section"的行后追加
sed '/section/a\追加内容' config.ini 

4. 打印文本(p 命令)

# 打印第5-10行
sed -n '5,10p' log.txt  
# 打印含"ERROR"的行
sed -n '/ERROR/p' app.log

5. 行号处理(= 命令)

# 打印含"warning"的行号
sed -n '/warning/=' messages.log 

🔧 四、高级技巧

1. 多命令执行

# 方式1:分号分隔
sed 's/a/b/; s/c/d/' file.txt  
# 方式2:-e 选项
sed -e 's/a/b/' -e 's/c/d/' file.txt 

2. 引用变量

# 双引号支持变量扩展
new="orange"; sed "s/apple/$new/g" file.txt  
# 单引号需拼接变量
sed 's/apple/'"$new"'/g' file.txt 

3. 正则表达式分组

使用 \(...\) 捕获内容,\1 引用分组:

# 提取IP地址(匹配inet后的内容)
ifconfig ens33 | sed -n 's/.*inet \(.*\) net.*/\1/p'

4. 多行处理

通过 N(读取下一行)、D(删除模式空间首行)等命令合并多行:

# 将空行分隔的记录合并为单行
sed '/./!{H;$!d}; x; s/\n/ /g' data.txt

🧩 五、实战案例

  1. 批量修改配置文件

    # 替换所有.conf文件中的旧IP
    sed -i 's/192.168.1.1/192.168.1.2/g' /etc/*.conf    ```
    
    
  2. 清理日志文件

    # 删除3天前的日志(日期格式YYYY-MM-DD)
    three_days_ago=$(date -d "3 days ago" +%Y-%m-%d)
    sed -i "/^$three_days_ago/d" app.log    
    
  3. 提取HTML链接

    sed -n 's/.*href="\([^"]*\)".*/\1/p' index.html    
    
  4. 备份并修改文件

    # 修改前创建.bak备份
    sed -i.bak 's/TMOUT=300/TMOUT=0/' /etc/profile    
    

⚠️ 六、注意事项

  1. 备份文件:使用 -i.bak 避免误操作丢失数据。
  2. 特殊字符转义:替换内容含 / 时改用 #@ 作分隔符(例:s#/old#/new#g)。
  3. 性能优化:大文件处理时避免复杂正则,优先使用 awkperl
  4. 测试验证:正式执行前移除 -i 测试输出,确认无误后再修改源文件。

Sed的精髓在于**“以行为单位的流式处理”**,结合正则表达式可高效解决90%的文本编辑需求。复杂场景(如JSON解析)建议结合 jqPython 工具