簡體   English   中英

正則表達式使用文件名外殼腳本過濾文件

[英]regex to filter files using filename shell script

嘗試根據文件名約定過濾文件

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                                                                                                                             

輸出 :不能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]“未找到

感謝您的幫助。

Bash沒有正則表達式,Shell有Globbing

您將在linux中的命令中使用regex,例如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

如您所見,正則表達式不是問題,而是您使用的地方。 您可以了解通配符或使用egrep,sed,awk代替簡單的ls。

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

提示2:Standard_ [0-9] *部分起作用,因為'*'在正則表達式和通配符中是通配符

Bash的擴展范圍可以在這里為您提供幫助:

$ 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”。

“ ls”的問題在於它不完全符合正則表達式posix。 那就是瘋狂。 但是'grep'是兼容的,並且可以很好地與'ls'一起玩。

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

我喜歡“ perl”樣式的正則表達式(PCRE),因此可以解釋“ grep”命令中看起來很奇怪的“ -P”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM