你的代码需要批量替换变量名?这个脚本能帮你吗?

wen 实用脚本 45

本文目录导读:

你的代码需要批量替换变量名?这个脚本能帮你吗?

  1. Python脚本 - 简单替换
  2. Shell脚本 (Linux/Mac)
  3. 更智能的版本 - 支持作用域检测
  4. 完整解决方案 - 支持配置
  5. 注意事项
  6. 单行命令极速版

是的,完全可以通过脚本批量替换变量名,这里我提供几个不同场景的解决方案:

Python脚本 - 简单替换

import re
import os
def batch_rename_variables(directory, old_name, new_name, extensions=['.py', '.js', '.java']):
    """批量替换目录下所有文件中的变量名"""
    for root, dirs, files in os.walk(directory):
        for file in files:
            if any(file.endswith(ext) for ext in extensions):
                filepath = os.path.join(root, file)
                with open(filepath, 'r', encoding='utf-8') as f:
                    content = f.read()
                # 使用正则匹配变量名(单词边界)
                new_content = re.sub(r'\b' + re.escape(old_name) + r'\b', new_name, content)
                if new_content != content:
                    with open(filepath, 'w', encoding='utf-8') as f:
                        f.write(new_content)
                    print(f"已修改: {filepath}")
# 使用示例
batch_rename_variables('./project', 'old_var_name', 'new_var_name')

Shell脚本 (Linux/Mac)

#!/bin/bash
# rename_vars.sh
OLD_NAME="old_var"
NEW_NAME="new_var"
# 递归查找并替换
find . -type f \( -name "*.py" -o -name "*.js" \) -exec sed -i "s/\b${OLD_NAME}\b/${NEW_NAME}/g" {} \;
echo "变量替换完成"

更智能的版本 - 支持作用域检测

import ast
import os
class VariableRenamer(ast.NodeTransformer):
    def __init__(self, old_name, new_name):
        self.old_name = old_name
        self.new_name = new_name
        self.scope_stack = [set()]
    def visit_Name(self, node):
        # 只在当前作用域内替换
        if node.id == self.old_name and self._in_scope(node):
            return ast.copy_location(
                ast.Name(id=self.new_name, ctx=node.ctx), node)
        return node
    def visit_FunctionDef(self, node):
        # 函数参数也属于该作用域
        params = {arg.arg for arg in node.args.args}
        self.scope_stack.append(params)
        self.generic_visit(node)
        self.scope_stack.pop()
    def _in_scope(self, node):
        # 检查变量是否在当前作用域内定义
        for scope in reversed(self.scope_stack):
            if self.old_name in scope:
                return True
        return False
def smart_rename(filepath, old_name, new_name):
    """智能变量重命名"""
    with open(filepath, 'r') as f:
        tree = ast.parse(f.read())
    renamer = VariableRenamer(old_name, new_name)
    new_tree = renamer.visit(tree)
    with open(filepath, 'w') as f:
        f.write(ast.unparse(new_tree))

完整解决方案 - 支持配置

创建一个配置文件 rename_config.json

{
  "replacements": [
    {"old": "oldVar1", "new": "newVar1"},
    {"old": "oldVar2", "new": "newVar2"}
  ],
  "file_extensions": [".py", ".js", ".ts", ".java"],
  "exclude_dirs": [".git", "node_modules", "__pycache__"]
}

Python脚本:

import json
import re
import os
def batch_rename_from_config(config_file):
    with open(config_file, 'r') as f:
        config = json.load(f)
    for root, dirs, files in os.walk('.'):
        dirs[:] = [d for d in dirs if d not in config['exclude_dirs']]
        for file in files:
            if any(file.endswith(ext) for ext in config['file_extensions']):
                filepath = os.path.join(root, file)
                with open(filepath, 'r', encoding='utf-8') as f:
                    content = f.read()
                original = content
                for replacement in config['replacements']:
                    content = re.sub(
                        r'\b' + re.escape(replacement['old']) + r'\b',
                        replacement['new'],
                        content
                    )
                if content != original:
                    with open(filepath, 'w', encoding='utf-8') as f:
                        f.write(content)
                    print(f"已修改: {filepath}")
batch_rename_from_config('rename_config.json')

注意事项

  • 安全备份:运行前建议先git commit或备份
  • 正则匹配:使用\b单词边界避免误替换子字符串
  • 文件编码:注意处理不同编码的文件
  • 测试运行:先用print查看将要替换的内容

单行命令极速版

# Linux/Mac - 替换Python文件中的变量
grep -rl 'old_var' . --include="*.py" | xargs sed -i 's/\bold_var\b/new_var/g'
# 带预览
grep -rn 'old_var' . --include="*.py" | grep -v '.bak'

你需要哪个版本?我可以根据你的具体需求调整脚本逻辑。

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