我需要从日志文件中获取文件路径。我想我会用正则表达式尝试这个。
文件路径如下所示:
75/751234/751234V0001_test-tag1-tag02-75x75_01.jpg
我不是正则表达式方面的专家,所以我只能使用以下表达式到达第二个斜杠。我还通过正则表达式获取文件名的开头,但我无法获取后面的几个关键字。
([0-9]{2})[\/]([0-9]{2,10})[\/]
现在我仍然缺少实际文件名的正则表达式。文件名始终以数字开头。之后理论上可以有无限的关键词。
文件扩展名可以是 .jpg、.tif、.zip 等。
所以输出应该是文件路径
75/751234/751234V0001_test-tag1-tag02-75x75_01.jpg
也许有人有一个解决方案,甚至是对我迄今为止的正则表达式的改进。
答案1
您的文件路径似乎是按如下方式组织的:
- 文件名以多位数字开头。
- 该路径以包含该数字的前两位数字的目录开头。
- 它继续是一个包含整个号码的子目录。
- 有问题的文件直接位于该子目录中,并且除了以上述编号开头之外,还具有有限的可能性集的扩展名。
如果您有不同的方法来识别包含文件名的行,这可能更好。如果存在不同模式的文件名,并且您想关注显示的模式,则以下正则表达式应该有效(示例grep
在 ERE 模式下使用 GNU):
grep -E -w -o '([[:digit:]]{2})/(\1[[:digit:]]+)/\2[^[:digit:]][^/]*\.(jpg|tif|zip)' logfile.txt
这使用反向引用(\1
和\2
)来确保“相同的文本”在字符串中的不同位置匹配。
- 该字符串需要以两位数字和一个斜杠开头。
- 然后需要以与开头相同的两位数字继续,后跟一个未指定的数字(如果数字有固定范围,则可以用 替换 ),以及一个
+
斜杠{2,10}
- 然后,它以与第二个路径元素相同的编号开始,后面跟着一个非数字字符(以确保该数字确实与第二个路径元素相同)以及除
/
(排除子目录中的文件或防止同一行中存在多个文件路径)之外的任意数量的其他字符,直到最终替代文件扩展名(您可以根据需要调整扩展名的数量)。 - 该
-o
选项确保仅返回该行的匹配部分(即文件路径)。该-w
选项确保结果仅匹配完整字符串,即不匹配可能较长文件路径的子字符串。这要求文件名不包含空格(这是文件名的有效字符!)。
请注意,严格来说,反向引用是保证仅在基本正则表达式中工作的功能,而替代项仅保证在扩展正则表达式中工作。 GNUgrep
扩展正则表达式确实允许反向引用,因此它在这种情况下有效(这可能不是太大的限制)。