使用 grep/xargs 获取需求文件 (PIP) 中用 ">= 列出的当前安装版本的命令

使用 grep/xargs 获取需求文件 (PIP) 中用 ">= 列出的当前安装版本的命令

我有一个requirements.txt列出版本的文件,例如

# requirements.txt
channels==2.4.0
colorama>=0.2.3
daphne==2.5.0
django-q>=1.1.4

对于具有 PIP 的版本==,会安装该确切版本,但对于具有 PIP 的版本,>=会安装基于其他软件包的最高版本。我想将所有软件包的已安装版本保存在>=一个新文件中(或者如果可能的话直接覆盖原始文件中的版本),因此结果可能是:

# requirements_updates.txt
channels==2.4.0
colorama==0.4.3
daphne==2.5.0
django-q==1.3.4

我已经 cat requirements.txt | grep -Po ".*?(?=>=)" | xargs -I "python -m pip freeze | grep %" | grep -Po "(?<===).*?(?=$)"在测试期间尝试过类似的方法(您可能应该忽略它),但它在多个管道之后停止生成输出,并且它也没有考虑==应该盲目复制的包。与脚本相比,我更喜欢命令,因为它很容易在已运行的 Docker 容器中共享和使用。

答案1

你可以这样做:

python -m pip freeze |
  awk '!x              {v[$1] = $2; next}
       NF>1 && $1 in v {$0 = $1"=="v[$1]}
                       {print}
      ' FS='==' - x=1 FS='>=' requirements.txt

相关内容