实用脚本能批量替换吗?

wen 实用脚本 10

本文目录导读:

实用脚本能批量替换吗?

  1. 最强大的“瑞士军刀”:sed (Linux/macOS原生,Windows需WSL或Git Bash)
  2. 纯Python脚本(跨平台,功能可定制)
  3. 极简Bash脚本(Linux/macOS)
  4. 可视化工具(适合非技术用户)
  5. 总结与选择

当然可以!批量替换是脚本的核心优势之一,无论是处理文本文件、代码、配置文件还是数据,一个实用脚本都能让枯燥的重复工作变成一次性的指令。

下面我为你介绍几种常见场景下的实用批量替换脚本,涵盖了从最简单到最强大的方案。

最强大的“瑞士军刀”:sed (Linux/macOS原生,Windows需WSL或Git Bash)

对于纯文本文件的批量替换,sed 是最快、最直接的命令行工具。

基本语法:

sed -i 's/旧文本/新文本/g' 文件名
  • -i: 直接修改文件(原地替换),没有 -i 只会预览结果。
  • s: 替换命令。
  • g: 全局替换(替换行中所有匹配),不加 g 只替换每行第一个。

实用范例:

  1. 批量替换单个文件中的所有 "foo" 为 "bar":

    sed -i 's/foo/bar/g' myfile.txt
  2. 批量替换当前目录下所有 .txt 文件:

    sed -i 's/old_string/new_string/g' *.txt
  3. 批量替换子目录中所有 .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
    )

如何运行:

  1. 将上述代码保存为 batch_replace.py
  2. 在终端中运行: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 "替换完成!"

如何使用:

  1. 保存脚本,赋予执行权限:chmod +x replace_in_files.sh
  2. 运行:./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() 语句来预览结果,确保正确。
  • 注意转义:如果旧文本或新文本包含特殊字符(如 、、 等),需要进行转义。

希望这些脚本和思路能帮你高效完成批量替换工作!

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