簡體   English   中英

Bash 正則表達式:如何使用“grep”或“ls”匹配 n 次

[英]Bash regex: how to match n times using 'grep' or 'ls'

我想用grepls以下列方式匹配 n 個數字:

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

以上是行不通的,我現在已經嘗試了很多方法......這怎么辦?

我知道還有其他方法,但請注意,我想知道這是否可行: [[:digit:]]{6}使用grepls

是的,可以使用以下兩種方法之一:

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為正則表達式。 Glob 表達式和正則表達式是兩種不同的東西,所以你不能指望它們的語法是一樣的。

您需要轉義大括號,因為基本 grep 使用 BRE(基本正則表達式),其中\\{\\}就像一個重復量詞,其中未轉義的{}將匹配文字{ , }大括號。

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

最好使用錨點。

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

使用bash不需要grep

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

@Avinash Raj 給你的答案是正確的。 但也有另一種方式。 如果您不想轉義大括號(即您的 grep 表達式更長,您可能會迷失在其中),您可以使用egrep

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

暫無
暫無

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

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