0

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

作为执行一系列其他有趣事情(似乎都有效)的脚本的一部分,我正在尝试从文件名中提取数据……存在某些预期的模式……例如,某些文件名将具有日期:日期的格式为“YYYY-MM-DD”,我可以轻松地找出整个事情,然后通过 grepping 将其分解'\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.gifgrep 找不到匹配项。

下划线给出了什么?为什么它们会导致我的正则表达式失败?有没有更好的方法来解决这个问题,我可能不知道?我有极少的 perl 和 java 技能,但我非常了解 bash 的方式......或者我认为我知道......

我想我可以重命名文件,但这似乎不优雅。

4

1 回答 1

1

您的正则表达式使用\b,它匹配单词和非单词字符之间的边界。问题是它_是一个单词字符,数字也是,所以_and之间没有边界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]|$)
于 2013-07-25T17:17:41.797 回答