我想从dotenv
迁移到env-var
的npm包。
因此,我正在寻找一种智能而简单的方法来搜索和替换每个文件上的模式。
我的目标是从这个模式process.env.MY_VAR
移动到env.get('MY_VAR').required()
从process.env.MY_VAR || DEFAULT_VALUE
移动到env.get('MY_VAR').required().default('DEFAULT_VALUE')
作为参考,我找到这个命令clear; grep -r "process.env." --exclude-dir=node_modules | sed -r -n 's|^.*.([[:upper:]_]+).*$|1=|p' > .env.example
来生成.env.example
显然我可以使用sed -e "s/pattern/result/" <file list>
,但我不确定如何捕获模式,并在结果中返回相同的模式。
我认为你已经明白了答案的主要部分。但我不清楚你指的是MY_VAR
。如果它实际上是名称MY_VAR或者它只是所有由大写字符和下划线组成的变量名的虚拟名称。我希望是后者。然后你可以这样写:
sed "s/<process.env.([A-Z_]*)>/env.get('1').required()/" <file list>
这将读取所有文件并将它们全部输出到stdout,同时完成替换。但是我猜你应该直接在文件中使用-i
进行就地替换(小心!)。
既然你有几个替代品,你可以分别给出每个替代品,像
sed -i -e "s/pattern1/result1/" -e "s/pattern2/result2/" <file list>
注意:上面描述的事情肯定可以通过多种其他方式完成,这只是我对你的问题的解释的一种解决方案!
我建议你先学习一些regexp的教程。它是一种方便的工具,在大多数编程语言和编程工具中以一种或另一种形式存在(sed
只是其中一种工具)。
sed -E '
s/(^|[^[:alnum:]_])process.env.([[:alnum:]_]+) || ([[:alnum:]_]+)($|[^[:alnum:]_])/1env.get('''2''').required().default('''3''')4/g
s/(^|[^[:alnum:]_])process.env.([[:alnum:]_]+)($|[^[:alnum:]_])/1env.get('''2''').required()3/g
' myfile
两个替换命令必须按照上面的顺序执行,因为第二个模式也匹配第一个模式(这是我们不希望看到的)。
模式(^|[^[:alnum:]_])
只是<
字边界符号的一个更可移植的版本。
请记住,您可以在sed中使用-i
标志来就地编辑文件。
在你的问题的第三段运行这个(例如),我们得到:
我的目标是从这个模式env.get('MY_VAR').required()移动到env.get('MY_VAR').required()和从这个模式env.get('MY_VAR').required().default('DEFAULT_VALUE')移动到env.get('MY_VAR').required().default('DEFAULT_VALUE')