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

时间:2013-07-25 17:12:00

标签: regex bash grep localization collation

我已经搜索过,甚至喘息阅读手册页,我仍然无法弄清楚这是什么以及如何修复它...我承认自己是一个正则表达式,所以不要羞耻! (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周围的方式很好......或者我以为我做了...

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

1 个答案:

答案 0 :(得分: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]|$)