2013-05-14 51 views
0

我很缺乏經驗,一般通配符開始。如何將一個去寫匹配文件名入手,比如,「AB」,但仍需要至少2長度的glob模式?即「開始比其他東西2個字母串‘AB’,」這是一個家庭作業問題,只有基本的bash水珠是允許的,並且必須與工作「呼應這裏> <水珠」。glob模式匹配非隱藏的文件名不與特定的字符串

注:這個問題逐字是

(非隱藏)在當前目錄中的名稱中包含至少兩個字符的文件,但不與AB開始。

打印在紙張上。我很確定我沒有誤解任何東西。要求如下:

對於以下每個文件搜索條件,請提供匹配 條件的匹配模式。您在各種情況下的答案應該是具有以下格式的文本文件:

echo <pattern> 

我現在的嘗試是echo {a[!b]*,[!a.]?*}但不知何故,它變得沒有點與實際不自動運行您對測試用例文件自動分級機人爲干預。

+2

由於問題的表述很奇怪,我懷疑你的老師正在尋找答案'[^ a] [^ b] *'。這是一個常見的錯誤,在答案中給出了幾個正確的(但必然是非基本的)解決方案。 –

+1

@thatotherguy,我認爲'[^ a]?*'是一個更好的答案,無論如何不會有錯誤 – perreal

+2

@perreal:他知道,​​但他也假設(像我一樣)這個問題的答案實際上並不存在,並提供了一些誤解,教師可能會對答案應該是什麼,這實際上是錯誤的。 – Wrikken

回答

2

以 「A」 或 「B」 或與 「AB」 開始?對於後:

ab* 

不用說,你必須指定解析(相對或絕對)的路徑:

/path/to/ab* 

要更新的問題:

{b,c,d,e,f...}{a,c,d,e,f...}* 

應該工作,注意...實際上不是有效的,但我不會在這裏寫全字母。 :P

+0

對不起,我問了一個錯誤的問題。我現在大量編輯我的帖子。 – user54609

+0

@EricDong:然後檢查我的更新。 –

+0

@EricDong:再次更新以允許以'ba'開頭的文件名。 –

3

對於一個字母,這會做:

$ echo [!a]?* 

然而,2個英文字母(假設文件也可以開始用數字或標點符號或其他各種東西),我只能認爲這不訴諸shopt

$ GLOBIGNORE=ab* 
$ echo * 

好了,現在,在技術上,這會工作:

$ echo [!a]?* [a][!b]* 

但是,如果有沒有文件以a +1或更多的額外字符開頭,這不僅是不受歡迎的,甚至在任何應用程序中都被視爲一個錯誤,所以這會在我們的結果中留下令人討厭的[a][!b]*。我不認爲這是一個有效的答案。爲了省略[a][!b]*,我們求助於nullglob(如果不允許extglobnullglob可能不是非此即彼):

$ shopt -s nullglob 
$ echo [!a]?* [a][!b]* 

FWIW,extglob是:

$ shopt -s extglob 

$ echo!(ab *) 以前的答案會匹配少於2個字符的文件,所以像@perreal說:

$ @([^a]?|?[^b])* 
+0

extglob不允許。必須使用在沒有管道回聲後立即使用的香草球。 – user54609

+0

不錯,值得我投票。 –

+1

@EricDong:好吧,用香草球'GLOBIGNORE'就是我能給你的。我認真地懷疑沒有這個或者一個'shopt',除非你使用'echo [!a]?* [a] [!b] *'並且你不介意'[a] [!b] *'如果沒有以「a」開頭的文件,則返回結果。 – Wrikken

1
shopt -s extglob   # turn on extended globbing 
echo @([^a]?|?[^b])* 
+0

extglob不允許。我們需要使它與echo之後立即放置的東西一起工作。 ;不允許,也不是一個大的shell腳本。 – user54609

+0

啊,你說得對,我的'extglob'沒有達到'最少2個字母'的要求​​。 – Wrikken

0

我的原始echo {a[!b]*,[!a.]?*}是正確的作品非常好。老師實際上設置了錯誤的測試用例,所以每個人都被錯誤地標記了,並且剛剛得到了一個評論。

+0

由於{a [!b] *,[!a。]?*}會立即擴展(大括號擴展在其他擴展之前發生)到一個[!b] * [!a。]?*沒有理由以這種方式使用支架擴展。如果你想表達這樣一個事實,即兩個子模式都有一個共同的後綴{a [!b],[!a。]?} *擴展爲與原始文件相同的內容,並且縮短了,但仍然比擴展時間更長。 – flabdablet

相關問題