尝试根据文件名约定过滤文件
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;找不到
感谢您的帮助。
答案 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'。