本文目录导读:

Python脚本(最灵活)
#!/usr/bin/env python3
# file: batch_replace.py
import os
import re
from pathlib import Path
def batch_replace_text(directory, old_text, new_text, file_pattern="*.txt"):
"""
批量替换指定目录下文件中的文本
"""
path = Path(directory)
count = 0
for file_path in path.rglob(file_pattern):
if file_path.is_file():
try:
# 读取文件内容
content = file_path.read_text(encoding='utf-8')
# 执行替换
new_content = content.replace(old_text, new_text)
# 如果有替换,写回文件
if new_content != content:
file_path.write_text(new_content, encoding='utf-8')
count += 1
print(f"已替换: {file_path}")
except Exception as e:
print(f"处理 {file_path} 时出错: {e}")
print(f"共替换了 {count} 个文件")
def batch_replace_regex(directory, pattern, replacement, file_pattern="*.txt"):
"""
使用正则表达式批量替换
"""
path = Path(directory)
count = 0
for file_path in path.rglob(file_pattern):
if file_path.is_file():
try:
content = file_path.read_text(encoding='utf-8')
new_content = re.sub(pattern, replacement, content)
if new_content != content:
file_path.write_text(new_content, encoding='utf-8')
count += 1
print(f"已替换: {file_path}")
except Exception as e:
print(f"处理 {file_path} 时出错: {e}")
print(f"共替换了 {count} 个文件")
# 使用示例
if __name__ == "__main__":
# 简单文本替换
batch_replace_text(
directory="./my_files", # 目标目录
old_text="旧文本",
new_text="新文本",
file_pattern="*.txt"
)
# 或使用正则表达式
# batch_replace_regex(
# directory="./my_files",
# pattern=r"\d{4}-\d{2}-\d{2}", # 匹配日期格式
# replacement="2024-01-01",
# file_pattern="*.md"
# )
Bash脚本(Linux/Mac)
#!/bin/bash
# file: batch_replace.sh
# 用法: ./batch_replace.sh "旧文本" "新文本" "文件模式"
OLD_TEXT="$1"
NEW_TEXT="$2"
FILE_PATTERN="${3:-*.txt}"
# 单文件替换
replace_in_file() {
local file="$1"
if [[ "$OSTYPE" == "darwin"* ]]; then
# macOS
sed -i '' "s|$OLD_TEXT|$NEW_TEXT|g" "$file"
else
# Linux
sed -i "s|$OLD_TEXT|$NEW_TEXT|g" "$file"
fi
echo "已替换: $file"
}
# 批量替换所有匹配的文件
find . -type f -name "$FILE_PATTERN" | while read file; do
if grep -q "$OLD_TEXT" "$file" 2>/dev/null; then
replace_in_file "$file"
fi
done
echo "替换完成!"
# 使用示例:
# ./batch_replace.sh "旧文本" "新文本" "*.md"
带交互界面的Python版本
#!/usr/bin/env python3
# file: batch_replace_gui.py
import tkinter as tk
from tkinter import filedialog, messagebox
from pathlib import Path
import tkinter.ttk as ttk
class BatchReplaceGUI:
def __init__(self, root):
self.root = root
root.title("批量替换工具")
root.geometry("600x400")
# 目录选择
tk.Label(root, text="目标目录:").grid(row=0, column=0, padx=5, pady=5)
self.dir_var = tk.StringVar()
tk.Entry(root, textvariable=self.dir_var, width=50).grid(row=0, column=1, padx=5)
tk.Button(root, text="浏览", command=self.browse_dir).grid(row=0, column=2)
# 文件模式
tk.Label(root, text="文件模式:").grid(row=1, column=0, padx=5, pady=5)
self.pattern_var = tk.StringVar(value="*.txt")
tk.Entry(root, textvariable=self.pattern_var, width=50).grid(row=1, column=1, padx=5)
# 替换内容
tk.Label(root, text="被替换文本:").grid(row=2, column=0, padx=5, pady=5)
self.old_var = tk.StringVar()
tk.Entry(root, textvariable=self.old_var, width=50).grid(row=2, column=1, padx=5)
tk.Label(root, text="替换为:").grid(row=3, column=0, padx=5, pady=5)
self.new_var = tk.StringVar()
tk.Entry(root, textvariable=self.new_var, width=50).grid(row=3, column=1, padx=5)
# 运行按钮
tk.Button(root, text="开始替换", command=self.run_replace, bg="green", fg="white").grid(row=4, column=1, pady=20)
# 结果显示
self.text_area = tk.Text(root, height=15, width=70)
self.text_area.grid(row=5, column=0, columnspan=3, padx=10, pady=10)
# 滚动条
scrollbar = tk.Scrollbar(root, command=self.text_area.yview)
scrollbar.grid(row=5, column=3, sticky='ns')
self.text_area.config(yscrollcommand=scrollbar.set)
def browse_dir(self):
directory = filedialog.askdirectory()
if directory:
self.dir_var.set(directory)
def log(self, message):
self.text_area.insert(tk.END, message + "\n")
self.text_area.see(tk.END)
self.root.update()
def run_replace(self):
directory = self.dir_var.get()
if not directory:
messagebox.showerror("错误", "请选择目标目录")
return
pattern = self.pattern_var.get()
old_text = self.old_var.get()
new_text = self.new_var.get()
if not old_text:
messagebox.showerror("错误", "请输入被替换文本")
return
self.text_area.delete(1.0, tk.END)
self.log(f"开始处理目录: {directory}")
self.log(f"文件模式: {pattern}")
self.log(f"替换: '{old_text}' -> '{new_text}'")
self.log("-" * 50)
count = 0
for file_path in Path(directory).rglob(pattern):
if file_path.is_file():
try:
content = file_path.read_text(encoding='utf-8')
new_content = content.replace(old_text, new_text)
if new_content != content:
file_path.write_text(new_content, encoding='utf-8')
count += 1
self.log(f"✓ {file_path.relative_to(directory)}")
except Exception as e:
self.log(f"✗ 错误处理 {file_path.name}: {e}")
self.log(f"\n完成!共替换了 {count} 个文件")
if __name__ == "__main__":
root = tk.Tk()
app = BatchReplaceGUI(root)
root.mainloop()
使用sed命令(快速方法)
# Linux
sed -i 's/旧文本/新文本/g' 文件路径
# 批量处理
for file in *.txt; do
sed -i 's/旧文本/新文本/g' "$file"
done
# 递归目录
find . -name "*.txt" -exec sed -i 's/旧文本/新文本/g' {} \;
使用建议
- 备份重要文件:在批量替换前最好备份
- 先测试:先用少量文件测试替换效果
- 编码问题:处理中文文件时注意编码
- 正则表达式:需要复杂匹配时使用正则
选择哪种方法取决于你的具体需求:
- 简单替换:用sed或简单Python脚本
- 复杂操作:用Python脚本
- 可视化操作:用GUI版本