怎样实现批量替换字符脚本

wen 实用脚本 26

本文目录导读:

怎样实现批量替换字符脚本

  1. Python脚本(最灵活)
  2. Bash脚本(Linux/Mac)
  3. 带交互界面的Python版本
  4. 使用sed命令(快速方法)
  5. 使用建议

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' {} \;

使用建议

  1. 备份重要文件:在批量替换前最好备份
  2. 先测试:先用少量文件测试替换效果
  3. 编码问题:处理中文文件时注意编码
  4. 正则表达式:需要复杂匹配时使用正则

选择哪种方法取决于你的具体需求:

  • 简单替换:用sed或简单Python脚本
  • 复杂操作:用Python脚本
  • 可视化操作:用GUI版本

抱歉,评论功能暂时关闭!