shell 从nodejs项目的实际使用中提取环境变量,并生成一个. env.sample文件

lndjwyie  于 2023-02-24  发布在  Shell
关注(0)|答案(1)|浏览(199)

我工作的项目中的. env.sample文件总是过时的。我该如何写一个一行程序来递归地搜索项目中的所有文件,并将使用的env变量提取到一个. env.sample文件中呢?
理想情况下,一行bash脚本应该与以下所有格式匹配

process.env.MY_VAR
process.env.MY-VAR
process.env["MY_VAR"]
process.env['MY_VAR']
process.env[MY_VAR] // MY_VAR here being a constant which holds the actual key value

找到唯一的值并打印到一个示例.env文件中,该文件可以插入到预提交钩子或管道中。

pod7payv

pod7payv1#

下面是一行程序,应该可以使用

grep -rhoP  "process\.env[\.\[](\"|\')?[A-Z0-9_\-]+(\"|\')?[\]]?" ./src \
| sed -r -n  's|^.*\.([[:upper:]0-9_-]+).*$|\1=|p' | sort --unique >  .env.sample

分解它

  1. grep -rhoP "process\.env[\.\[](\"|\')?[a-zA-Z0-9_\-]+(\"|\')?[\]]?" ./src
    Grep修饰符
-P, --perl-regexp
      Enables support for PCRE regexp
      Note: OpenBSD version of grep do not support PCRE expressions, GNU grep required on MacOS  

    -r recursive
      Read all files under each directory, recursively, following symbolic links 
      only if they are on the command line.

    -o, --only-matching
      Print only the matched (non-empty) parts of a matching line, on a separate output line.

    -h, --no-filename
      Suppress the prefixing of file names on output
  • 正则表达式process\.env[\.\[](\"|\')?[A-Z0-9_\-]+(\"|\')?[\]]?
  • 匹配字符串文字process.env
  • [\.\[]与文字“.”或“[”匹配
  • (\"|\')?可选择匹配单引号或双引号
  • [A-Z0-9_\-]+匹配一个或多个大写字母、数字、下划线和破折号
  • (\"|\')?可选择匹配单引号或双引号
  • [\]]?可以选择匹配文字“]”
  • sort --unique我们只需要不同的值并按字母顺序排序(使用一致的键排序列表使diff比较更容易)
  • sed -r -n 's|^.*\.([[:upper:]0-9_]+).*$|\1=|p'
  • 以前正则表达式的较短版本,匹配文字“s.”后或以“”开头的所有大写字符、数字、破折号。
  • 插入“=”并自动打印输出
    注意无论如何,这都不是一个简单或全面的方法。例如,它不匹配小大小写环境变量或大量其他访问方法,例如const { MY_VAR } = process.env之类的对象解构

相关问题