2016-06-28 35 views
0

我想從文件grep模式使用egrep和正則表達式沒有成功。grep與特定的下劃線模式的文件名

我需要的是獲得與示例的慣例名稱的文件:

xx_code_lastname_firstname_city.doc 

的代碼應該至少有3位,姓氏和名字及城市可以在大小不等

我想下面的代碼,但它無法實現我的願望:

ls -1 | grep -E "[xx_][A-Za-z]{3,}[_][A-Za-z]{2,}[_][A-Za-z]{2,}[_][A-Za-z]{2,}[.][doc|pdf]" 

即試圖從beggining,那麼至少有3個字的任何代碼得到標準XX_然後它必須有另一個下劃線,等等。 任何人都可以幫忙嗎?

+0

不要使用'ls | grep' - 見http://mywiki.wooledge.org/ParsingLs –

+0

你可以指定你使用的是哪個shell嗎?紅帽運送幾個 - bash? mksh? –

+2

順便說一句,'[xx_]'匹配*一個*字符,可以是'x'或'_'。 –

回答

5

考慮一個extglob,具體如下:

#!/bin/bash 
shopt -s extglob # turn on extended globbing syntax 

files=(xx_[[:alpha:]][[:alpha:]]+([[:alpha:]])_[[:alpha:]]+([[:alpha:]])_[[:alpha:]]+([[:alpha:]])_[[:alpha:]]+([[:alpha:]])[email protected](doc|docx|pdf)) 

[[ -e ${files[0]} ]] || -L ${files[0]} ]] && printf '%s\n' "${files[@]}" 

這工作,因爲

[[:alpha:]][[:alpha:]]+([[:alpha:]]) 

...匹配的三個或更多的字母字符的任意字符串 - 明確他們兩個,其中一個與+()一個或多個extglob語法。


同樣,

@(doc|docx|pdf) 

...匹配任何三個特定字符串的。

+0

只需使用'nullglob',溝醜''[[-e || -L]]技巧,你會在評論':)'中看到我的建議。 –

+0

@gniourf_gniourf,我對'nullglob'有一點警惕,除非我們指示OP立即將其關閉 - 如果沒有參數,很容易陷入具有默認行爲的陷阱,爲什麼nullglob是從默認開始。 –

+0

然後使用'failglob'。但是在使用球體時強烈建議使用。 –

3

所以你試圖匹配字面xx_?然後開始你的模式。

xx_ 

接下來是您試圖匹配的「3位數字」。我將假設根據你自己的正則表達式,用「數字」表示字符(因此是[a-zA-Z]字符類)。讓量詞不要貪婪以避免任何意外的捕捉行爲。

xx_[a-zA-Z]{3,}? 

對於名字和姓氏部分,我看到您指定了至少包含2個字符的變量長度。讓我們來確定這些量詞是不是非常貪婪的,在我們的量詞後面追加?這個字符。根據你的正則表達式,它也看起來像你期望你的城市結構採取類似的名字和姓氏位的形式。那我們再添加三個。

xx_[a-zA-Z]{3,}?_[a-zA-Z]{2,}?_[a-zA-Z]{2,}?_[a-zA-Z]{2,}\. 

注意:我們並不需要讓城市量詞非貪婪,因爲我們斷言,它的後面是文字".",這是我們不希望其他地方出現在我們感興趣的文本在匹配。注意它是如何轉義的,因爲它是正則表達式語法中的元字符。

最後是文件擴展名,你的例子中有"docx"。我也看到你在你的正則表達式中加入了"doc""pdf"擴展名。讓我們結合所有這三個。

xx_[a-zA-Z]{3,}?_[a-zA-Z]{2,}?_[a-zA-Z]{2,}?_[a-zA-Z]{2,}\.(docx?|pdf) 

希望這能奏效。評論你是否需要任何澄清。請注意0​​和"docx"部分如何濃縮爲一個元素。這不是必要的,但我認爲這種形式看起來更有意思。它也可以寫成(doc|docx|pdf)。我的口味有點重複。

+0

'grep -E'不支持'\ w',它使用POSIX ERE語法,沒有PCRE擴展。 (如果使用libpcre支持進行編譯,某些版本的GNU grep支持'grep -P',但這是非常可選的編譯時間擴展)。 –

+0

好的。然後我將使用特定的字符類。我總是使用PCREs ...幫助我保持理智。 – wpcarro

+1

就我個人而言,我會使用'[[:alpha:]]'優先於'[a-zA-Z]' - 當然,如果您在'C'語言環境中沒有區別,但我們有讀者在世界的其他地方,用不同的字母表。 :) –