【问题标题】:Grep exact matching string (path) using wildcards (regex)使用通配符(正则表达式)Grep 精确匹配字符串(路径)
【发布时间】:2021-11-11 04:10:13
【问题描述】:

我有一个包含路径列表的文本,我只想在所有具有特定前缀 (foo) 的目录中选择一个指向 yml 的特定路径。

所以当我运行grep -Eo "^config/foo.*/db.yml" 时,它还会选择子目录中的其他 db.yml 文件,这不是我所期望的:(

实际输出:

config/footestto/db.yml
config/foodummy/db.yml
config/footestto/prod/db.yml

预期输出:

config/footestto/db.yml
config/foodummy/db.yml

你能帮帮我吗?我的正则表达式可能有问题。谢谢。

【问题讨论】:

  • 使用 [^/]* 而不是 .* (类似这样的地方有一个副本,其答案适合但问题不同:stackoverflow.com/questions/1103149/…
  • 如果输出来自find 命令,您可以探索其选项-mindepth-maxdepth,可以在所需的目录树中适当设置仅打印您需要的文件深度/级别。
  • 您显示了预期的输出,但没有显示您从中获得该输出的输入,因此这只是一个示例,让我们猜测。 edit您的问题以包含示例输入。

标签: regex linux sed grep


【解决方案1】:
$ egrep -w '^config\/foo[a-z]+\/db.yml' test.txt

您的正则表达式不正确:

\/ 匹配字符 /

[a-z]+ 匹配字母一次且无限次

直到找到/db.yml

【讨论】:

  • egrepgrep -E 弃用,字符类[[:lower:]][a-z] 更便携,但[^/] 无论如何都会更准确,OP 使用的是.*所以你应该有*而不是+,这样就不需要1个或多个额外的字符,.是一个通配符,所以db.yml将匹配dbxyml,表达式没有锚定在最后并且所以会匹配.../dbxymlfoo.txt,你不需要在正则表达式中转义/,因为它已经是文字了,-w 是匹配单词,但你的正则表达式包含非单词组成字符。所以 ITYM grep -E '^config/foo[^/]*/db\.yml$'.
  • 感谢您的回答,我也可以改进我的正则表达式 knowknowlegde,我对其进行了测试,我认为您忘记了 \ 所以好的应该是 grep -E '^config\/foo[^\/]*\/db\.yml$'
  • 不客气,但正如我在之前的评论中所说 - 你不需要在正则表达式中转义 /,因为它已经是字面的,所以 / 是正确的,你不需要做\/。再看一遍,您也不需要-E,因为该正则表达式中没有任何需要ERE的内容,因此命令可以只是grep '^config/foo[^/]*/db\.yml$'
猜你喜欢
  • 1970-01-01
  • 2011-08-10
  • 1970-01-01
  • 1970-01-01
  • 2012-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多