You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Bash脚本批量将JS变量声明赋值合并为单行?

批量修改JS代码:移除中间变量直接赋值

问题场景

我有多个定义API的JS文件,需要把以下形式的代码:

var someVar = {};
object.someVar = someVar;

以及多行对象的情况:

var otherVar = {
/*
Some docs
*/
someProperty,
/*
More docs
*/
anotherProperty

}

object.someVar.otherVar = otherVar;

修改为直接赋值的形式:

object.someVar = {};
object.someVar.otherVar = {
/*
Some docs
*/
someProperty,
/*
More docs
*/
anotherProperty

}

想知道能否用Bash脚本实现,自己对Bash不熟悉,觉得sed搞不定这种跨行的复杂匹配。


解决方案:用awk脚本实现批量替换

sed确实难以处理这种跨行的变量定义+后续赋值的匹配逻辑,但awk可以轻松搞定。以下是具体实现:

  1. 创建awk脚本文件replace_vars.awk:
#!/usr/bin/awk -f

/^var / {
    # 提取变量名
    split($0, parts, "=");
    var_name = parts[1];
    gsub(/^var /, "", var_name);
    gsub(/[[:space:]]+$/, "", var_name);
    
    # 提取变量值部分
    value_part = substr($0, index($0, "=")+1);
    gsub(/^[[:space:]]+/, "", value_part);
    
    # 处理多行对象:读取直到找到闭合的}
    if (value_part ~ /^{/) {
        while (1) {
            getline next_line;
            value_part = value_part "\n" next_line;
            if (next_line ~ /}/) break;
        }
    }
    
    waiting_assign = 1;
    saved_var = var_name;
    saved_value = value_part;
    next;
}

waiting_assign && /=/ {
    split($0, assign_parts, "=");
    right_side = assign_parts[2];
    gsub(/^[[:space:]]+/, "", right_side);
    gsub(/[[:space:]]*;?$/, "", right_side);
    
    if (right_side == saved_var) {
        left_side = assign_parts[1];
        gsub(/[[:space:]]+$/, "", left_side);
        print left_side " = " saved_value;
        waiting_assign = 0;
        next;
    } else {
        print "var " saved_var " = " saved_value;
        print $0;
        waiting_assign = 0;
        next;
    }
}

{ print $0 }
  1. 给脚本添加执行权限:
chmod +x replace_vars.awk
  1. 处理文件
  • 单个文件处理(输出到新文件):
./replace_vars.awk input.js > output.js
  • 批量处理当前目录下所有JS文件(并覆盖原文件,建议先备份):
for js_file in *.js; do
    # 先备份原文件
    cp "$js_file" "$js_file.bak"
    # 执行替换并覆盖原文件
    ./replace_vars.awk "$js_file" > "$js_file.tmp" && mv "$js_file.tmp" "$js_file"
done

脚本工作逻辑

  • 识别以var 开头的变量定义行,提取变量名和对应的值;
  • 如果变量值是多行对象(以{开头),会自动读取后续行直到找到闭合的};
  • 等待后续的赋值语句,当匹配到对象路径 = 变量名;的行时,直接替换为对象路径 = 变量值;;
  • 如果遇到不匹配的情况,会原样输出之前的变量定义行和当前行,避免破坏无关代码。

内容的提问来源于stack exchange,提问作者Adma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 05:45:54