【问题标题】:Linux command line regexLinux命令行正则表达式
【发布时间】:2012-06-21 18:17:47
【问题描述】:

我想在目录中搜索所有以 .m 结尾的文件,以查找诸如 @"LBL_18989" @"LBL_15459" 、@"LBL_14359" 之类的字符串 ...

我的命令是:

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

但它没有给出预期的结果。

【问题讨论】:

  • @F.J. - 编辑帖子以纠正他的代码错误会导致混乱。
  • 原来的查找命令是:find . type f -name *.m | grep '@"LBL_[[0-9]"]+'。它不允许我更改帖子,因为删除“\”不是 6 个字符的更改。
  • 您是否尝试 grep 查找具有该字符串模式的文件名或包含具有该模式的文本数据的文件?
  • @jordanm,除了为代码格式添加缩进以使其更易于阅读外,我没有编辑任何内容。我认为 OP 实际上打算在那里有 \* (因为没有必要逃避 * 让它出现在 SO 中)。
  • F.J. - 对不起,我没有看来源差异,你是对的。

标签: regex macos bash shell


【解决方案1】:

你应该总是引用你的论点。 find 的 -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 {} +

【讨论】:

  • 我实际上只是在自己输入那个编辑作为答案。你也可以写成:-exec grep -H -E '@"LBL_[[:digit:]"]+' {} \;
  • @jdi - 是的,这是我通常使用的方式,但 -H 不是 POSIX,问题被标记为 OSX。
  • 我现在在 OSX 机器上。无论如何,对我来说都很好
【解决方案2】:

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

grep '@"LBL_[[0-9]"]+'

还匹配文件名,例如

  1. @"LBL_"
  2. @"LBL_2"
  3. @"LBL_3"3"
  4. @"LBL_"4

如果您的列表确实具有代表性,我会改为使用

grep '@"LBL_[[0-9]]+"'

并将引号字符移动到加号之后,在模式的末尾。 您可以使用 grep,也许这就是您的用例,但如果您使用 egrep 或 grep 和 -E 开关,您就可以使用 [[:digit:]] 类。 POSIX.2 不赞成使用破折号的括号表达式中的范围。来自 POSIX 规范:“范围非常依赖于排序顺序,可移植程序应避免依赖它们。”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    相关资源
    最近更新 更多