Linux sed 命令完整指南 - 从文本替换到批量文件修改一步搞定

概述

本文将介绍在 Linux 环境中能够快速且准确地替换和编辑文本文件内容的强大流编辑器 —— sed 命令。从基础字符串替换到特定行删除,再到在备份的同时直接修改原文件的内联(-i)选项,通过实战示例带您轻松掌握。

1. 准备实验环境及 sed 基本字符串替换(s 命令)

为了安全地进行 sed 命令练习,执行 mkdir -p ~/sed_practice && cd ~/sed_practice 命令以创建专用目录并进入该目录。

mkdir -p ~/sed_practice && cd ~/sed_practice

为了构建字符串替换练习所需的示例文本,执行 echo -e 'apple is delicious\nbanana is yellow\napple is red' > fruits.txt 命令将内容写入文件。

echo -e ‘apple is delicious\nbanana is yellow\napple is red’ > fruits.txt

sed 命令是用于处理和编辑文本流的流编辑器。
使用 s 替换操作符将每行中首次出现的 apple 字符串替换为 orange 并输出到屏幕上。
源文件 fruits.txt 的内容不会被修改,仅在标准输出中显示结果。
⚙️ [常用选项]

-i : 不在屏幕上显示输出结果,而是直接修改并保存源文件。
-e : 一次连接并执行多个编辑脚本命令。
-n : 抑制模式空间的自动输出,仅输出明确指定的行。
-E 或 -r : 启用扩展正则表达式(ERE)语法。

sed ’s/apple/orange/’ fruits.txt

在替换表达式末尾加上 g 标志,可对单行中所有匹配的目标进行全局(global)替换。
当每行中存在多个相同的匹配项且希望全部替换无一遗漏时使用此选项。

sed ’s/apple/orange/g’ fruits.txt

2. 选择性输出特定行及删除行(d 与 -n 选项)

为了准备行选择与删除练习所需的日志数据,执行 echo -e 'Line 1: Server OK\nLine 2: Server Warning\nLine 3: Server Error\nLine 4: Server OK' > server.log 命令创建示例文件。

echo -e ‘Line 1: Server OK\nLine 2: Server Warning\nLine 3: Server Error\nLine 4: Server OK’ > server.log

结合 -n 选项与 p 命令,仅将指定范围的第 2 行到第 3 行输出到屏幕。
在需要抑制默认的自动输出、仅筛选并查看特定行时非常有用。

sed -n ‘2,3p’ server.log

使用 d 命令配合模式匹配,排除包含 Warning 字符串的行,仅将剩余内容输出到屏幕。
常用于过滤不需要的日志或符合特定条件的行。

sed ‘/Warning/d’ server.log

指定特定行号并执行 d 命令,输出删除第 2 行后的结果。
在需要删除特定行号的内容并查看文件时使用。

sed ‘2d’ server.log

3. 直接修改源文件及自动备份(-i 选项)

为了进行配置文件修改练习,创建包含环境变量示例数据的 config.env 文件。

echo -e ‘PORT=8080\nDEBUG=true\nTIMEOUT=30’ > config.env

使用 -i.bak 选项生成源文件的备份副本 config.env.bak,同时将 DEBUG=true 设置立即替换为 DEBUG=false 并保存到源文件中。
在安全保留修改前状态的同时直接修改源文件时非常实用。

sed -i.bak ’s/DEBUG=true/DEBUG=false/’ config.env

使用 cat 命令查看修改后的 config.env 文件内容。
可以看到 DEBUG 的值已成功更改为 false 并写入文件。

cat config.env

输出并检查自动生成的备份文件 config.env.bak 的内容。
可以看到修改前的原始内容 DEBUG=true 保持原样,安全地得到了备份。

cat config.env.bak

4. 利用正则表达式与更改分隔符实现高级文本替换

为了生成路径替换练习所需的文件路径示例数据,使用 echo 命令向 paths.txt 文件写入内容。

echo -e ‘Old path: /usr/local/bin\nNew path: /usr/local/bin’ > paths.txt

使用竖线(|)符号代替默认的分隔符斜杠(/)作为替换分隔符,安全地将路径中的 /usr/local/bin 替换为 /usr/bin 并输出。
在处理包含斜杠的文件路径或 URL 时,无需使用转义字符(\)即可简洁明了地编写表达式。

sed ’s|/usr/local/bin|/usr/bin|g’ paths.txt

为了进行利用正则表达式去除空格的练习,创建包含首尾空格的 spaces.txt 示例文件。

echo -e ’   leading spaces\nno spaces\n   trailing removed   ’ > spaces.txt

匹配表示行首的 ^ 符号与表示空格及制表符的 [ \t]* 正则表达式,将每行开头的空格全部删除并输出。
在需要批量清理文档或日志数据中的缩进空格时非常实用。

sed ’s/^[ \t]*//’ spaces.txt

至此,我们整理了 Linux sed 命令从基础文本替换到批量修改文件的核心用法。
作为一个能够大幅减少重复性文件编辑工作的强大工具,希望您在需要时能够灵活运用。