一个pip需求文件包含所有已安装的 Python 包,因此该文件可以在其他地方使用并重建原始编程环境。
需求文件如下所示:
alabaster==0.7.9
arrow==0.8.0
awesome-slugify==1.6.5
Babel==2.3.4
binaryornot==0.4.0
blessings==1.6
我想要的是删除指示版本的部分,在第一行的情况下alabaster==0.7.9
,删除部分==0.7.9
并仅保留alabaster
。
我知道找到匹配会创建两个组,但我无法让它工作。我正在使用awk在ubuntu上进行如下尝试。
当我订购第一组时:
$ awk -F"==" '{print $1}' base.txt
我明白了:
alabaster==0.7.9 arrow==0.8.0 awesome-slugify==1.6.5
也就是说,该文件被重复。
当我订购第二组时
$ awk -F"==" '{print $2}' base.txt
我只得到 50 个空行。
添加:
现在我用这个模式进行搜索,(\w+)(==.)
我用它制作了两个匹配组,我对第一个感兴趣。但是,如果调用包python-mimeparse
,则不再匹配。您应该能够添加连字符以防调用某些包paquete_python
或paquete-python
.
附录 2
这个表达式(.+)(==)(.+)
找到了三个组,第一个是包(这是我要找的),第三个是版本。现在我只需要知道如何在awk
.
第三版
我发布了一个在 Python 中解决问题的答案,但想法是该解决方案与其他一些工具一起应用,例如awk
、甚至.gawk
sed
perl
这篇SOen 帖子中有几个选项,但我无法在其中任何一个上使用我的搜索模式。我没有错误,但也没有输出。
一些考虑:
- 我只想获取包名称,而不是版本
- 没有安装包,所以没有什么要更新的
- 该解决方案可以使用其他工具,例如
sed
或grep
A. == 左边的值
选项1。
捕获之前的所有内容 ==
选项 2。
在不从 == 捕获组的情况下进行匹配
谢谢@fedorqui
演示
结果
B. == 权利的价值
=.*
演示
结果
该解决方案
awk -F'==' '{print $1}' archivo
使用带有多字符的字段分隔符 ( FS )。只要您使用awk
符合 POSIX 的版本,这就是有效的。例如,在 Solaris 上它不起作用。所以问题是:如何让它发挥作用?
所以让我们简化一下:该文件由格式为 的行组成
módulo==versión
。因此,我们能做的就是删除=
及其后面的所有内容:这就是说:根据
=
分隔符 (-d=
) 分隔行并打印第一个结果字段 (-f1
)。它可能有点脆弱,因此您也可以选择使用
sed
:这做同样的事情:从第一个符号中删除
=
。但是,它允许将命令扩展到更复杂的东西,例如:仅在包含
==
. 如果你逼我,你可以说:仅打印这些行(
-n
默认禁用打印并p
打印当前行)。如果您真的想
match()
使用 awk,请使用:如您所见,语法是
match(línea, patrón, matriz de resultados)
. 因此,这是一个捕获我们感兴趣的问题:在这种情况下,只有第一个,所以实际上我们可以限制自己说match($0, /^(.+)==/, res)
,而无需捕获其余部分。简而言之:
awk
这似乎不是最好的解决方案,因为根据不同的环境,您可能会遇到多字符字段分隔符的问题。在这种情况下使您的生活变得轻松sed
:当一个sed
简单的正则表达式已经为您提供了所需的一切时,无需使用如此复杂的正则表达式。在 Bash 中试试这个命令:
requirements.txt
将是 pip 要求文件。重要的是要使用的正则表达式,我放的那个包括连字符或下划线分隔符的要求;我从@A更新了示例。Cedano所以你可以在这里看到它。
如果您需要将输出保存到文件中(您可能会这样做),您显然可以使用输出重定向;即:
希望对你有帮助,问候。
Python中的替代方案如下:
re
处理正则表达式的模块。pattern
或模式:paquete
,由任何字符和任何数量组成。version
并由第二组之后的其余字符组成。paquete
(即match )。