Linux命令行正则表达式

时间:2012-06-19 16:45:06

标签: regex macos bash shell

我想在目录中搜索所有以.m结尾的文件,如@“LBL_18989”@“LBL_15459”,@“LBL_14359”......

我的命令是:

find . type f -name \*.m | grep '@"LBL_[[0-9]"]+' 

但它不起作用:(

2 个答案:

答案 0 :(得分:3)

你应该总是引用你的论点。你的-name模式包含一个“*”,这意味着shell会在将它传递给find之前尝试将其扩展为glob。您也可以使用-regex而不是将find的输出传递给grep。

find . -type f -regex '@"LBL_[[:digit:]"]+'

根据jdi的评论,您可能希望搜索给定正则表达式的那些文件的内容。如果是这样,您可以使用以下内容:

find . type f -name '*.m' -exec grep -E '@"LBL_[[:digit:]"]+' /dev/null {} +

答案 1 :(得分:0)

你的代码适合我。但是,您在问题中声明的正则表达式将不仅仅与示例列表中的文件名匹配。如果您要查看您的文件名是否需要名称验证,这可能是一个问题,因为有些人将验证确实不应该。你的正则表达式

grep'@“LBL _ [[0-9]”] +'

还匹配文件名,例如

  1. @ “LBL _”
  2. @ “LBL_2”
  3. @ “LBL_3” 3"
  4. @ “LBL_” 4
  5. 如果您的列表真的具有代表性,我会使用

    grep'@“LBL _ [[0-9]] +”'

    并将引号字符移到加号之后,在模式的末尾。 您可以使用grep,也许这是您的用例,但如果您使用egrep或grep与-E开关,则可以使用[[:digit:]]类。 POSIX.2使用短划线字符对括号表达式中的范围进行了皱眉。从POSIX规范:“范围非常依赖于整理顺序,便携式程序应该避免依赖它们。”