本文目录导读:

- 最强大的“瑞士军刀”:
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()语句来预览结果,确保正确。 - 注意转义:如果旧文本或新文本包含特殊字符(如 、、 等),需要进行转义。
希望这些脚本和思路能帮你高效完成批量替换工作!
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播