如果字符串有下划线,则使用bash grep -Po regex失败

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

我已经搜索过,甚至喘不过气来阅读手册页,我仍然无法弄清楚这是什么以及如何修复它...我承认自己是一个正则表达式,所以不要羞耻! (Ubuntu 12.04,bash 4.2.25,GNU grep 2.10)

作为一个脚本的一部分,它做了许多其他有趣的事情(似乎都工作)我试图从文件名中提取数据...存在某些预期的模式...例如某些文件名将有一个日期:日期的格式为“YYYY-MM-DD”,我可以轻松地将整个事情弄清楚并稍后通过使用'\b[0-9]{4}.{1}[0-9]{2}.{1}[0-9]{2}\b'进行分解(实际上我通常可以安全地用'\b[0-9]{4}\b'直接定位年份)这样可以正常工作输入字符串看起来像这两个:

something 1989-07-23 something.jpg" or "foo-2013-01-10-bar.csv

但如果它看起来像wordsidon'tcareabout_2004-09-14_otherthings.tif或这个foofoobarbar_2010-07-16.gif grep找不到匹配。

下划线给出了什么?为什么他们会导致我的正则表达式失败?有没有更好的方法可以解决这个问题,我可能对此一无所知?我有超极小的perl和java技能,但我知道我在bash周围的方式很好......或者我以为我做了...

我想我可以重命名文件,但这看起来不太优雅。

regex bash grep localization collation
1个回答
1
投票

你的正则表达式使用\b,它匹配单词和非单词字符之间的边界。问题是_是一个单词字符,数字也是如此,所以_2之间没有边界。

您可以使用

[^0-9][0-9]{4}.{1}[0-9]{2}.{1}[0-9]{2}[^0-9]

代替。如果日期可以在文件名的开头或结尾,请使用:

([^0-9]|^)[0-9]{4}.{1}[0-9]{2}.{1}[0-9]{2}([^0-9]|$)
© www.soinside.com 2019 - 2024. All rights reserved.