【问题标题】:regex to filter files using filename shell script正则表达式使用文件名 shell 脚本过滤文件
【发布时间】:2017-10-24 17:55:30
【问题描述】:

尝试根据文件名约定过滤文件

eg: Standard_<number>_<15digitnumber>.xml

我能够使用以下命令来获取符合上述条件的文件,但它还包括中间的 varchar。

ls Standard_[0-9]*_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].xml                                                                                                                         

输出:
标准_2149190256_151116162725717.xml
标准_2149190257_151116162725717.xml
标准_2149ABCDE_151116162725717.xml

在上面突出显示的输出中,它返回字符串,因为我在中间的数字后面有 *。我尝试在 [0-9] 之前和之后放置 + 以仅包含数字,但该命令不起作用。

ls Standard_[0-9]+_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].xml                                                                                                                             

输出:不能 ls: "/somefolder/Standard_[0-9]+_[0-9][0-9][0-9][0-9][ 0-9][0-9][0-9][0-9][0-9][0-9][0-9]" 未找到

ls Standard_+[0-9]_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].xml                                                                                                                               

输出:不能 ls: "/somefolder/Standard_+[0-9]_[0-9][0-9][0-9][0-9][ 0-9][0-9][0-9][0-9][0-9][0-9][0-9]" 未找到

感谢您的帮助。

【问题讨论】:

  • 请查看Markdown help 页面,以帮助您正确格式化此问题,使其清晰易读
  • @ctwheels 感谢您的回复。我刚刚更新了格式。

标签: regex linux bash shell sftp


【解决方案1】:

Bash 的extended globbing 可以在这里为您提供帮助:

$ printf "%s\n" Standard*
Standard_2149190256_151116162725717.xml
Standard_2149190257_151116162725717.xml
Standard_2149ABCDE_151116162725717.xml

$ shopt -s extglob nullglob

$ printf "%s\n" Standard_+([0-9])_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].xml
Standard_2149190256_151116162725717.xml
Standard_2149190257_151116162725717.xml

这里,+([0-9]) 匹配一个或多个数字的序列,我们排除了文件“Standard_2149ABCDE_151116162725717.xml”。

【讨论】:

    【解决方案2】:

    Bash 没有正则表达式,shell 有 Globbing。

    您将在 linux 中的命令中使用正则表达式,例如 egrep、sed ...

    文件 Standard_01234_012345678912345.xml

    1 - 正如你正在做的那样

     ls Standard_[0-9]+_[0-9]{15}.xml
     ls: cannot access Standard_[0-9]+_[0-9]{15}.xml: No such file or directory
    

    2 - 使用 egrep

    ls -l |egrep Standard_[0-9]+_[0-9]{15}.xml
    -rw-r--r-- 1 root   root   0 Oct 24 16:07 Standard_01234_012345678912345.xml
    

    如您所见,您的正则表达式不是问题,而是您在哪里使用。您可以了解 globbing 或使用 egrep、sed、awk 代替简单的 ls。

    提示 1:[0-9]{15} 与重复 [0-9] 15 次相同。

    提示 2:Standard_[0-9]* 起作用的部分原因是 '*' 在正则表达式和通配符中是通配符

    【讨论】:

      【解决方案3】:

      “ls”的问题在于它不完全符合正则表达式 posix。那就是疯狂。但是 'grep' 是兼容的,并且可以很好地与 'ls' 配合使用。

          ls Standard_*.xml | grep -P [[:digit:]]+_[[:digit:]]{15}
      

      我喜欢“perl”风格的正则表达式 (PCRE),这样可以解释“grep”命令上看起来很奇怪的“-P”。

      【讨论】:

      • 我尝试使用您提供的命令,结果是所有以 Standard 开头的文件,我也没有提到我想在连接到 SFTP 服务器后执行此操作。下面是我在运行 ls 命令之前用来连接到 SFTP 的命令。理想情况下,我必须使用 Mget 来获取与文件约定匹配的所有文件。 sftp -oIdentityFile=//.ssh/id_rsa @
      猜你喜欢
      • 2018-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-18
      • 1970-01-01
      • 2013-03-29
      • 2011-08-10
      • 1970-01-01
      相关资源
      最近更新 更多