Bash grep正则表达式

4

我有一个字符串从文件中获取,格式如下:

__version__ = '10.11.12'

版本号也可以是这种格式:0.1.2 或者 100.20.30

我有以下bash命令,但我的问题是它只能抓取每个数字中的一个值:

MODULE_VERSION=$(cat <%= project %>/__init__.py | grep -o '[0-9].[0-9].[0-9]')

我希望修改grep正则表达式以获取版本的所有数字值。


你正在使用BSD grep,对吧?安装GNU版本,它会提取所有出现的内容。顺便说一下,你需要使用grep -o '[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*'来提取10.11.12 - Wiktor Stribiżew
1
MODULE_VERSION=$(cat <%= project %>/init.py | grep -o '[0-9]+.[0-9]+.[0-9]+') 尝试这个.. + 检查一个或多个数字,* 检查零个或多个数字。使用适合您需求的任何一个。 - Arihant
你真的有一个名为 <%= project %> 的目录吗?那需要加上引号。 - chepner
它正在使用 gulp.js。它是一个 Python 生成器,允许用户随意命名项目,并始终提取该项目名称。因此,我实际上没有名为 <%= project %> 的目录。 - user8128927
1个回答

6
您当前的正则表达式'[0-9].[0-9].[0-9]'将产生误报和漏报。'.'字符被保留用于表示任何字符,因此您必须使用反斜杠对其进行转义,以便仅匹配字符'.' 此外,'[0-9]'只会匹配一个数字出现的情况。您的正则表达式将匹配任何具有数字在位置1、3和5的5个字符。
误报示例: 1a2b3
漏报示例: 100.20.30
使用grep命令可以计算字符的出现次数。有关更多信息,请参见grep手册。如果您正在尝试匹配您提供的示例(XX.XX.XX | X.X.X | XXX.XX.XX),则以下正则表达式将匹配所有实例,并仅匹配遵循该模式的实例。缺点是它非常长(如果您知道更好的编写方法,请编辑)。
grep -o -E '([0-9]{3}\.[0-9]{2}\.[0-9]{2})|([0-9]\.[0-9]\.[0-9])|([0-9]{2}\.[0-9]{2}\.[0-9]{2})' 

如果您不太担心误报,可以简化为以下内容:
grep -E -o '[0-9]{1,3}\.[0-9]{1,2}\.[0-9]{1,2}'

这将匹配您未指定的某些实例。

误报示例
1.12.12
123.1.1
12.1.12
等等...

正如评论中所说,gnu grep将匹配所有出现的情况。 (我已经使用GNU grep 2.20测试了这些正则表达式)


谢谢。虽然这是我正在寻找的回答,但我决定采用不同的方法。最终为我工作的命令很简单: MODULE_VERSION=$(python -c "import <%= project %>s; print(<%= project %>.__version__)") - user8128927
这似乎比使用正则表达式来检测版本号更安全。很高兴你找到了解决方案。 - jTables

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接