本文目录导读:

- 最强大的“瑞士军刀”:
sed(Linux/macOS原生,Windows需WSL或Git Bash) - 纯Python脚本(跨平台,功能可定制)
- 极简Bash脚本(Linux/macOS)
- 可视化工具(适合非技术用户)
- 总结与选择
当然可以!批量替换是脚本的核心优势之一,无论是处理文本文件、代码、配置文件还是数据,一个实用脚本都能让枯燥的重复工作变成一次性的指令。
下面我为你介绍几种常见场景下的实用批量替换脚本,涵盖了从最简单到最强大的方案。
最强大的“瑞士军刀”:sed (Linux/macOS原生,Windows需WSL或Git Bash)
对于纯文本文件的批量替换,sed 是最快、最直接的命令行工具。
基本语法:
sed -i 's/旧文本/新文本/g' 文件名
-i: 直接修改文件(原地替换),没有-i只会预览结果。s: 替换命令。g: 全局替换(替换行中所有匹配),不加g只替换每行第一个。
实用范例:
-
批量替换单个文件中的所有 "foo" 为 "bar":
sed -i 's/foo/bar/g' myfile.txt
-
批量替换当前目录下所有
.txt文件:sed -i 's/old_string/new_string/g' *.txt
-
批量替换子目录中所有
.conf文件(Linux/macOS):find . -name "*.conf" -exec sed -i 's/old_config/new_config/g' {} \;
纯Python脚本(跨平台,功能可定制)
如果你需要更复杂的逻辑(比如正则表达式、条件判断、处理多种文件类型),Python是绝佳选择。
脚本 batch_replace.py:
import os
import re
from pathlib import Path
def batch_replace_in_files(root_dir, file_pattern, old_text, new_text, use_regex=False):
"""
在指定目录下,替换所有匹配文件中的文本。
Args:
root_dir (str): 要搜索的根目录。
file_pattern (str): 文件名模式,如 "*.txt", "*.py", "*.html"。
old_text (str): 要搜索的旧文本(或正则表达式)。
new_text (str): 要替换的新文本。
use_regex (bool): 是否将 old_text 视为正则表达式。
"""
replaced_count = 0
# os.walk 遍历所有子目录
for foldername, subfolders, filenames in os.walk(root_dir):
for filename in filenames:
# 使用 fnmatch 或 pathlib 检查文件名模式
if Path(filename).match(file_pattern):
filepath = os.path.join(foldername, filename)
try:
with open(filepath, 'r', encoding='utf-8') as f:
content = f.read()
new_content = None
if use_regex:
# 使用正则表达式替换
new_content = re.sub(old_text, new_text, content)
else:
# 简单文本替换
new_content = content.replace(old_text, new_text)
# 只有在内容真的被改变时才写入
if new_content != content:
with open(filepath, 'w', encoding='utf-8') as f:
f.write(new_content)
print(f"✅ 已替换: {filepath}")
replaced_count += 1
# else:
# print(f"⏭️ 无需修改: {filepath}")
except Exception as e:
print(f"❌ 错误处理 {filepath}: {e}")
print(f"\n🎉 完成! 共处理了 {replaced_count} 个文件。")
# --- 使用示例 ---
if __name__ == "__main__":
# 1. 简单替换:将当前目录下所有 .md 文件中的 "Python" 替换为 "Python3"
batch_replace_in_files(
root_dir=".",
file_pattern="*.md",
old_text="Python",
new_text="Python3"
)
# 2. 正则替换:将当前目录下所有 .txt 文件中的 "颜色: 红色" 或 "颜色: 蓝色" 替换为 "颜色: 绿色"
# 注意:正则表达式中的括号用于捕获,这里我们只是简单替换
batch_replace_in_files(
root_dir=".",
file_pattern="*.txt",
old_text=r"颜色:\s*(红色|蓝色)", # 正则:颜色: 后面跟着 红色或蓝色
new_text="颜色: 绿色",
use_regex=True
)
如何运行:
- 将上述代码保存为
batch_replace.py。 - 在终端中运行:
python batch_replace.py,根据需要修改if __name__ == "__main__":部分中的参数。
极简Bash脚本(Linux/macOS)
如果你经常做类似操作,可以把常用命令写成脚本。
脚本 replace_in_files.sh:
#!/bin/bash
# 用法: ./replace_in_files.sh "旧文本" "新文本" "文件扩展名"
# 示例: ./replace_in_files.sh "foo" "bar" "py"
if [ $# -ne 3 ]; then
echo "用法: $0 <旧文本> <新文本> <文件扩展名>"
echo "示例: $0 'foo' 'bar' 'py' (替换当前目录及子目录下所有 .py 文件中的 foo 为 bar)"
exit 1
fi
OLD_TEXT="$1"
NEW_TEXT="$2"
EXTENSION="$3"
echo "正在将所有 *.${EXTENSION} 文件中的 '${OLD_TEXT}' 替换为 '${NEW_TEXT}' ..."
# 使用 find + sed 组合(macOS 可能需调整 sed 参数)
# Linux 版:
find . -type f -name "*.${EXTENSION}" -exec sed -i "s/${OLD_TEXT}/${NEW_TEXT}/g" {} \;
# macOS 版(需要备份文件,或使用 gnu-sed):
# find . -type f -name "*.${EXTENSION}" -exec sed -i '' "s/${OLD_TEXT}/${NEW_TEXT}/g" {} \;
echo "替换完成!"
如何使用:
- 保存脚本,赋予执行权限:
chmod +x replace_in_files.sh - 运行:
./replace_in_files.sh "old" "new" "txt"
可视化工具(适合非技术用户)
如果你不熟悉命令行,也有图形化工具可以批量替换:
- VS Code (或其他现代编辑器):
- 快捷键:
Ctrl+Shift+H(Windows/Linux) 或Cmd+Shift+H(macOS) - 打开“在文件中查找”面板,输入旧文本和新文本。
- 点击“替换所有文件”或逐文件审查替换,支持正则。
- 快捷键:
- Notepad++:
- 打开“搜索” -> “在文件中查找”。
- 同样支持正则和批量替换。
总结与选择
| 场景 | 推荐工具 | 理由 |
|---|---|---|
| 一次性的、简单的、在命令行下 | sed |
最快,最直接,一行命令解决问题。 |
| 需要跨平台、复杂逻辑(正则、条件、统计) | Python 脚本 | 功能最强大,可定制性强,易于调试。 |
| 经常做同样操作,需要复用 | Bash 脚本 | 将常用命令封装起来,日后直接调用。 |
| 不熟悉命令行,或需要可视化预览 | VS Code / Notepad++ | 图形界面,安全,可以逐个确认替换,避免误操作。 |
安全提示:
- 备份!备份!备份! 批量替换前,最好先备份原文件或使用版本控制系统(如 Git)。
- 先测试:不加
-i参数运行sed或使用print()语句来预览结果,确保正确。 - 注意转义:如果旧文本或新文本包含特殊字符(如 、、 等),需要进行转义。
希望这些脚本和思路能帮你高效完成批量替换工作!