正则表达式使用文件名shell脚本过滤文件

时间:2017-10-24 17:55:31

标签: regex linux bash shell sftp

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

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                                                                                                                         

输出
Standard_2149190256_151116162725717.xml
Standard_2149190257_151116162725717.xml
Standard_的 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                                                                                                                             

输出:可以&#t; ts:&#34; / 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]&#34;找不到

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                                                                                                                               

输出:可以&#t; ts:&#34; / somefolder /标准_ + [0-9] _ [0-9] [0-9] [0-9] [ 0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9]&#34;找不到

感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

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] *的工作原因部分是因为'*'是正则表达式和通配符中的通配符

答案 1 :(得分:0)

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])匹配一个或多个数字的序列,我们排除了文件&#34; Standard_2149ABCDE_151116162725717.xml&#34;。

答案 2 :(得分:0)

'ls'的问题在于它并不完全符合正则表达式。那种方式就是疯狂。但是'grep'符合标准并与'ls'很好地搭配。

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

我喜欢“perl”风格的regexp(PCRE),因此可以解释'grep'命令中奇怪的'-P'。