【问题标题】:Bash regex: how to match n times using 'grep' or 'ls'Bash 正则表达式:如何使用“grep”或“ls”匹配 n 次
【发布时间】:2015-12-12 23:43:05
【问题描述】:

我想用grepls匹配n位数:

echo "ABCD150915.7z" | grep "ABCD[[:digit:]]{6}.7z"

上面的方法不起作用,我现在已经尝试了很多方法......怎么能做到这一点?

我知道还有其他方法,但请注意,我想知道这是否具体可行:[[:digit:]]{6} 使用 grepls

【问题讨论】:

    标签: regex bash grep ls


    【解决方案1】:

    您需要转义大括号,因为基本 grep 使用 BRE(基本正则表达式),其中 \{\} 充当重复量词,其中未转义的 {} 将匹配文字 {} 大括号。

    grep 'ABCD[[:digit:]]\{6\}\.7z'
    

    最好使用锚点。

    grep '^ABCD[[:digit:]]\{6\}\.7z$'
    

    【讨论】:

      【解决方案2】:

      是的,可以使用以下两种方法之一:

      echo "ABCD150915.7z" | grep -E "ABCD[[:digit:]]{6}.7z"
      

      使用-E启用扩展正则表达式模式意味着可以理解大括号。

      或者,您可以转义花括号:

      echo "ABCD150915.7z" | grep "ABCD[[:digit:]]\{6\}.7z"
      

      如果你想列出所有匹配模式的文件,你可以使用 glob 扩展代替:

      ls ABCD[0-9][0-9][0-9][0-9][0-9][0-9].7z
      

      ...如果您正在考虑遍历这些文件,您应该这样做:

      for file in ABCD[0-9][0-9][0-9][0-9][0-9][0-9].7z; do
          # stuff with "$file"
      done
      

      建议在这两种情况下启用failglob(使用shopt -s failglob),这样当没有文件与模式匹配时,不会执行命令/循环。

      这些示例中的 [0-9][[:digit:]] 并不完全相同,因此如果您需要与任何被视为数字的东西严格匹配,那么您应该改用它。

      需要明确的是,当您执行 ls ABCD[0-9][0-9][0-9][0-9][0-9][0-9].7z 时,shell 会将 glob 扩展为参数列表将其传递给 ls,因此 ls 并没有真正做很多其他事情而不是回应这些论点。这与传递给grep 的单引号参数形成对比,grep 将其解释为正则表达式。全局表达式和正则表达式是两个不同的东西,所以你不能期望它们的语法是一样的。

      【讨论】:

      • 谢谢,相当全面的回答。我确实尝试用'ls'转义花括号,但不幸的是它不起作用,我没有费心用'grep'尝试它。所以没有办法在'ls'中使用花括号?
      【解决方案3】:

      @Avinash Raj 给你的答案是正确的。但也有另一种方式。 如果您不想转义大括号(即您的 grep 表达式要长得多,您可能会迷失在其中),您可以使用 egrep

      echo "ABCD150915.7z" | egrep "ABCD[[:digit:]]{6}.7z"
      

      【讨论】:

      【解决方案4】:

      bash 不需要 grep

      foo=ABCD150915.7z
      if [[ $foo =~ ABCD[[:digit:]]{6}.7z ]]; then
         echo "Successful match"
      else
         echo "Match failed"
      fi
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-02-09
        • 1970-01-01
        • 1970-01-01
        • 2015-04-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多