javascript - 如何用 sed 替换缩小的 javascript 文件中的多个值
问题描述
我需要用 sed 替换缩小的 javascript 文件中的几个值。操作系统是 alpine Linux。
我正在尝试锻炼一个通用的正则表达式,它将找到foo:
任何字符,直到下一个,
像这样:foo:____
并替换为变量中的值foo:"bar"
或foo:!0
任何值。这个脚本需要一直工作。它不应该依赖于是在:
(意味着来自属性的值是什么)之后。
这是文件中的前几个字符
(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{3:function(l,n,t){l.exports=t("zUnb")},AytR:function(l,n,t){"use strict";t.d(n,"a",function(){return e});var e={appVersion:"1.4-beta",buildNr:"123.123",production:!0,tracking:!0,apiHost:"/api/",foo:""}},Cdxl:function(l,n,t){"use strict";t.d(n,"a",function(){return a});
这是我的开始,它根本不是通用的...
APP_VERSION='"1.4-beta"'
BUILD_NR='"20190118.1"'
PRODUCTION="!"
TRACKING="!0"
API_HOST='"/api/"'
FOO='"bar"'
# demo for the first 3 variables
sed -i "s/appVersion:[\"0-9A-Za-z.]*/appVersion:${APP_VERSION}/;s/buildNr:[\"0-9A-Za-z.]*/buildNr:${BUILD_NR}/;s/production:[!0-9A-Za-z.]*/production:${PRODUCTION}/" path/to/js-file.js
我尝试了几个小时 - 任何建议都非常受欢迎。
提前致谢!
解决方案
您可以使用g
正则表达式末尾的修饰符来替换所有出现的模式匹配。
一般示例
{one:"1",two:"2",three:"3",one:"one",plz:"nope"}
我想one
用"42"
. 没有全局修饰符,我得到这个结果:
$ sed -E 's/one:[^,]+/one:"42"/' foo.txt
{one:"42",two:"2",three:"3",one:"one",plz:"nope"}
注意第二个实例one:
没有改变。现在使用g
修饰符:
$ sed -E 's/one:[^,]+/one:"42"/g' foo.txt
{one:"42",two:"2",three:"3",one:"42",yas:"nope"}
这取代了所有的出现。
您的具体情况
将其粘贴到文件中,可能称为replacer.sh
:
#!/usr/bin/env bash
# declare `swap` to be an associative array
declare -A swap
swap[appVersion]='"1.4-beta"'
swap[buildNr]='"20190118.1"'
swap[production]="!"
swap[tracking]="!0"
swap[apiHost]='"\/api-2\/"'
swap[foo]='"bar"'
FILE=$1
for key in ${!swap[@]}; do sed -E -i 'bak' "s/${key}:[^,]+/${key}:${swap[${key}]}/g" $FILE; done
将变量中的键和值更改为swap
您需要的。大小写很重要,并转义值中的任何反斜杠。
如果你需要替换更多的东西,你可以简单地添加更多的键/值对。循环将遍历所有键,按顺序应用更改。
sed
-i
可以自动创建带有标志的备份文件;我认为这些可能会在循环的每次迭代中被吹走——在这里要小心。
像这样运行程序:$ ./replacer.sh filename.js
希望这可以帮助!