[英]Bash regex: how to match n times using 'grep' or 'ls'
我想用grep
或ls
以下列方式匹配 n 個數字:
echo "ABCD150915.7z" | grep "ABCD[[:digit:]]{6}.7z"
以上是行不通的,我現在已經嘗試了很多方法......這怎么辦?
我知道還有其他方法,但請注意,我想知道這是否可行: [[:digit:]]
和{6}
使用grep
或ls
。
是的,可以使用以下兩種方法之一:
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.