解析文件名以一致地获取Python包名称

问题描述 投票:0回答:1

需要一些脚本帮助。问题就在这里。我有一组python包(文件)

beautifulsoup4-4.12.2-py3-none-any.whl
certifi-2023.7.22-py3-none-any.whl
charset_normalizer-3.3.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
google-3.0.0-py2.py3-none-any.whl
idna-3.4-py3-none-any.whl
protobuf3-0.2.1.tar.gz
protobuf-3.19.6-py2.py3-none-any.whl
proton-0.9.1.tar.gz
python-qpid-proton-0.38.0.tar.gz
redis-4.5.5-py3-none-any.whl
requests-2.31.0-py3-none-any.whl
robotframework-6.1.1-py3-none-any.whl
robotframework_requests-0.9.1-py3-none-any.whl
robotframework-run-keyword-async-1.0.8.tar.gz
soupsieve-2.5-py3-none-any.whl
urllib3-2.0.7-py3-none-any.whl

我需要解析每个文件名以获取包名称及其版本。我有一些工作,而另一些则失败。基本上上面的列表应该可以找到每个的名称和版本。

beautifulsoup4                    4.12.2
certifi                           2023.7.22
charset-normalizer                3.3.1
google                            3.0.0
idna                              3.4
protobuf3                         0.2.1
protobuf                          3.19.6
proton                            0.9.1
python-qpid-proton                0.38.0
redis                             4.5.5
requests                          2.31.0
robotframework                    6.1.1
robotframework-requests           0.9.1
robotframework-run-keyword-async  1.0.8
soupsieve                         2.5
urllib3                           2.0.7

我尝试过 cut、grep、sed 和 awk 来实现此功能,但名称中出现的数字、多位数版本、模式不一致会导致其中一种或另一种方法失败。您还会注意到字符集和机器人框架请求将 _ 更改为 a - 但我希望这些情况不会那么频繁,当它发生时我可以解决这个问题。

我一直不知道如何让这项工作成功。有任何想法吗。这是我当前的脚本逻辑(fullName 是上面列出的文件名),但如果 certifi、charset-normalizer、idna、soupsieve 和 robotsframework-requests 失败。

version=`echo "$fullName" | grep -o '[0-9]\..*\.[0-9]'`
artifactId=`echo "$fullName" | sed -r "s/-${version}.*//g"`

特别针对当前脚本中那些不起作用的脚本,将工件和版本构建为:

certifi-2023.7.22-py3-none-any.whl  3.7.2
idna                                <missing>
robotframework_requests             0.9.1
soupsieve                           <missing>

如果有人有一个好的方法来使用正则表达式或任何其他 bash 脚本方法解析artifactId/版本,我愿意尝试任何事情。

谢谢

regex bash shell scripting
1个回答
0
投票

使用您显示的示例,请尝试以下

awk
解决方案。

awk '
FNR==NR{
  arr[$1]=$2
  next
}
{
  print ($1 in arr)?$1"\t"arr[$1]:$1 "\t" "<missing>"
}
' versionsFile.txt FS="-" packagesFile.txt  | column -t
© www.soinside.com 2019 - 2024. All rights reserved.