2015-08-08 49 views
2

我想刪除括號之間的所有文本,除非它包含4位數字。刪除括號之間出現的每個文本,除非它包含4位數字

源:

var="7 Days (TEXT) (some.other.text) (10%) (May contain 1000) (2003)" 

期望的輸出:

7 Days (2003) 

提前非常感謝。

+0

@Marc Towler也在純bash中測試過,但如果其他括號包含數字,則失敗:'shopt -s extglob; VAR = $ {風險//(* [^ 0-9] [^ 0-9] [^ 0-9] [^ 0-9])/}; shopt -u extglob' – Eelisland

+0

如果你對AWK很迷惑,你可以試試以下幾種方法: awk'STR1 = match($ 0,/^[^(] * /){print substr($ 0,RSTART,RLENGTH )}; STR2 = match($ 0,/ \([0-9] [0-9] [0-9] [0-9] \)/){print substr($ 0,RSTART,RLENGTH)}' –

回答

3
$ echo "$var" | sed 's/([^)]*[^[:digit:]()][^)]*)//g; s/([^)]\{0,3\})//g; s/([^)]\{5,\})//g' 
7 Days  (2003) 

工作原理:

  • s/([^)]*[^[:digit:]()][^)]*)//g

    這把已經在它與非數字的任何括號表達式。

  • s/([^)]\{0,3\})//g

    此刪除,在它具有3個或更少的字符任何括號表達式。

  • s/([^)]\{5,\})//g

    此刪除,在它具有5個或更多字符的任何括號表達式。

+0

Many謝謝,如果我只用's /([^)] * [^ [:digit:]()] [^)] *)// g'它適用於我的例子,你認爲我真的需要另外兩個sed比賽? – Eelisland

+0

明白! 'var =「7 Days(123)(12345)(TEXT)(some.other.text)(10%)(可能包含1000)(2003)」'添加到您的解決方案中另一個匹配刪除多餘空間'sed's /([^)] * [^ [:位:]()] [^)] *)//克; S /([^)] \ {0,3 \})//克; S /([^)] \ {5,\})//克; s/*// g;''問候。 – Eelisland

+1

非常好。而且,是的,這是消除多餘空白的好方法。 – John1024

相關問題