2012-11-07 39 views
0

我想將以下jdk-1.6.0_30-fcs.x86_64分割爲jdk-1.6.0_30。我嘗試了以下sed 's/\([a-z][^fcs]*\).*/\1/'但我最終與jdk-1.6.0_30-。我認爲這是錯誤的方式,是否有辦法從單詞的結尾開始並向後遍歷,直到我遇到-無法找出正則表達式bash或sed或awk

回答

1
測試

不完全是,但您可以將模式錨定到字符串w的末尾$。然後你只需要確保你重複字符可能不包括連字符:

echo jdk-1.6.0_30-fcs.x86_64 | sed 's/-[^-]*$//' 

這將匹配從-到字符串的結尾,但兩者之間的所有字符必須是不同-(使它與第一個連字符不匹配)。

稍微更詳細的解釋。引擎首先嚐試匹配文字-。這將首先在字符串中的第一個-工作(顯然)。然後[^-]*儘可能與非-個字符匹配,因此它將消耗1.6.0_30(因爲下一個字符實際上是連字符)。現在引擎會嘗試匹配$,但這不起作用,因爲我們不在字符串的末尾。發生一些回溯,但我們可以在這裏忽略。最後,引擎將放棄匹配第一個-並繼續穿過字符串。然後引擎將匹配文字-與第二個-。現在[^-]*將消耗fcs.x86_64。現在我們實際上是在字符串的末尾並且$會匹配,所以完全匹配(將被刪除的是)-fcs.x86_64

+0

仍然有點困惑,所以第一個'-'包含'-',那麼'[]'排除'-'和之後的任何東西?所以如果有3個'''那麼這會打印所有的前2個? – noMAD

+0

@noMAD編號'-'匹配連字符。 '[^ - ]'匹配非連字符。 '*'需要零個或更多的那些。和'$'匹配字符串的末尾。這隻能匹配上一個'-'到字符串末尾的字符串。否則會在匹配的字符串和字符串的末尾之間出現另一個'-',所以'[^ - ] *'無法到達字符串的末尾,並且'$'不匹配。這有任何意義嗎? –

+0

謝謝你,沒有道理:) – noMAD

1

試着這樣做:

echo 'jdk-1.6.0_30-fcs.x86_64' | sed 's/-fcs.*//' 

如果使用,你可以這樣做:

var=jdk-1.6.0_30-fcs.x86_64 
echo ${var%%-fcs*} 
jdk-1.6.0_30 

後來的解決方案使用參數擴展,在Linux和Minix3

+0

這要求'-'所應遵循'fcs'雖然。 –

1

使用cut >>

echo 'jdk-1.6.0_30-fcs.x86_64' | cut -d- -f-2