在 Bash 中,我可以Foo1.png
透過Foo9.png
使用Foo[0-9].png
.我可以避免Foo5.png
使用Foo[1-46-9].png
.有什麼方法可以指定一系列排除十進制數字嗎?
例如,如果我想排除Foo3.png
and Foo7.png
,我可以使用Foo[0-24-689]
,但我會找到一個Foo[^37].png
更容易閱讀的模式。這是 Vim 語法,Bash 不會解釋它(不包括3
和 )7
。但我想知道 Bash 在其檔案名稱擴展中是否有字元排除模式。
如果有匹配的解決方案全部除3
或之外的單個字符7
,在某些情況下也會有幫助(例如引發此問題的特定字符,儘管上面的描述過於簡化)。
答案1
shellbash
理解類似正規表示式的Foo[^37].png
模式和標準 shell 模式Foo[!37].png
,因此您可以毫無問題地使用它們,除非您有其他需要排除的名稱類似Food.png
或等的檔案。Fool.png
如果Foo[^37].png
在您的腳本中沒有按預期工作,則表示您沒有使用bash
,而是使用其他 shell,例如(可能在非 GNU 系統上?)您是否在命令列上dash
運行了腳本?sh
如果是這樣,請不要這樣做,並#!
在腳本中使用正確的 -line 指向正確的 shell 解釋器。
假設您想要排除類似的名稱Food.png
,以確保後面跟有Foo
數字,然後.png
使用Foo[0-9].png
。然後排除Foo3.png
和Foo7.png
其中
for name in Foo[0-9].png; do
case $name in (*[37].png) continue; esac
# process "$name" here
done
或者,使用bash
語法,
for name in Foo[0-9].png; do
[[ $name == *[37].png ]] && continue
# process "$name" here
done
正如 Stéphane Chazelas 在下面的評論中提到的,您可以使用擴展的通配模式來bash
測試3
和以外的數字7
。啟用擴充通配模式shopt -s extglob
,然後使用該模式
Foo!(!([0-9])|[37]).png
但對我個人來說,像這個答案的前半部分那樣編寫腳本會更快(或使用Foo[01245689].png
在決定我相信這個表達式正在做正確的事情(它做)。