如何用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可以轻松搞定。以下是具体实现:
- 创建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 }
- 给脚本添加执行权限:
chmod +x replace_vars.awk
- 处理文件
- 单个文件处理(输出到新文件):
./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
相关产品推荐
相关产品推荐

