如何使用 sed 使用 sed 正则表达式从 process.env.MY_VAR 迁移到 env.get('MY_VAR').required()?



我想从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')

最新更新