2011-10-18 51 views
2

的首要問題: 所以我有進來 JohnSmith14_120325_A10_6.raw 形式的文件名,我想用正則表達式來進行匹配。我在構建一個工作示例時遇到了一些問題,但不幸的是,除非我掌握基礎知識,否則我的問題將無法解決。匹配文件名使用grep

因此,我最近剛剛瞭解到管道系統,我學到的一件很酷的事情是我可以做以下事情。

X=ll_paprika.sc (don't ask) 
VAR=`echo $X | cut -p -f 1` 
echo $VAR 

這給了我paprika.sc 現在,當我嘗試在grep命令來執行管的想法,沒有任何反應。

x=ll_paprika.sc 
VAR=`echo $X | grep *.sc` 
echo $VAR 

任何人都可以解釋我做錯了什麼?

第二個問題: 如何使用正則表達式匹配單個下劃線?

這是我最終試圖做的;

VAR=`echo $X | grep -e "^[a-bA-Z][a-bA-Z0-9]*(_){1}[0-9]*(_){1}[a-bA-Z0-9]*(_){1}[0-9](\.){1}(raw)" 

所以在這裏我的模式的基本思路是,文件名必須以字母 開始,然後它可以有任意數量的字母和數字下它,它必須有一個_分隔的一系列數字另一個_分隔下一組數字和字符,另一個_分隔下一組數字,然後它必須有一個跟隨原始單個時間段。這看起來非常錯誤和醜陋(因爲我不確定語法)。那麼如何匹配文件擴展名?有人可以舉一個簡單的例子ll_parpika.sc,以便我能弄清楚如何做自己的正則表達式?

謝謝。

回答

3
x=ll_paprika.sc 
VAR=`echo $X | grep *.sc` 
echo $VAR 

這是不是你想要做的是grep匹配一行並返回它。 *.sc確實匹配11_paprika.sc,所以它返回整行並將其粘貼在$VAR中。

如果你只想得到它的一部分,cut行可能會更好。有一個grep -o選項只返回匹配的部分,但爲此你基本上必須放入你正在尋找的東西,在這一點上爲什麼要麻煩?

文件名必須用字母開頭

'的grep -e「^ [A-ZA-Z]

,然後它可以有任何字母數字 和以下它數字

[A-ZA-Z0-9] *

,它必須有一個_限定一個 一系列數字和另一個_來分隔下一組數字和 字符和另一個_來分隔下一組數字

(_ [0-9 ] +){3}

然後它必須有一個以下的原始時間段。

.RAW」

0

爲先,用途:

VAR=`echo $X | egrep '\.sc$'` 

對於第二個,你可以試試這個替代方案來代替:

VAR=`echo $X | egrep '^[[:alpha:]][[:alnum:]]*_[[:digit:]]+_[[:alnum:]]+_[[:digit:]]+\.raw'` 

注意,從你的角色等級你的表達不同於下面的描述,因爲它們似乎只允許某些地方的小寫字母ab例子是放寬這些地方的所有字母數字字符。