2012-10-25 53 views
3

我想寫一個正則表達式,它將捕獲文件中的名稱,其中某些行可能需要捕獲2個或更多名稱。Regex(sed),可能需要捕獲每行多個表達式

例如,我想借此與文件:

Field_1 \t Field_2 \t Field_3 \t JGN;Name=hsa-123;J4N9;Name=cfa-241-b 
Field_1 \t Field_2 \t Field_3 \t JPN;Name=hsa-1323;JJ39;Name=cfa-255-b;Name=hsa-188 

,並具有輸出文件返回:

Field_1 \t Field_2 \t Field_3 \t hsa-123; cfa-241-b 
Field_1 \t Field_2 \t Field_3 \t hsa-1323;cfa-255-b;hsa-188 

我使用正則表達式如下:

sed 's/\(.*\)\t\(.*\)\t\(.*\)\t.*\;Name=\(.*\);.*/\1\t\2\t\3\t\4\;\4/g' 

但這隻返回名字。任何建議,將不勝感激

回答

4

是否

sed 's/\([[:space:]]\|;\)[[:alnum:]]*;/\1/g; s/Name=//g' 

爲你工作?

+1

那麼,他/她也想刪除JGN;日本;等 – miono

+0

@ miono謝謝,我誤解了那部分,認爲這些都是一樣的。 Fixin'。 –

+0

@JonathanLeffler Right :)注意到這一點。答案正在建設中。抱歉。 –

0
$ sed -E 's/ [^ ;]+;//; s/;[^=]+;/;/g; s/Name=//g' file 
Field_1 \t Field_2 \t Field_3 \thsa-123;cfa-241-b 
Field_1 \t Field_2 \t Field_3 \thsa-1323;cfa-255-b;hsa-188 

如果sed的不supprrt ERES(-E)然後改變[^] +於[^] [^] *和[^ =] +於[^ =] [^ = ] *或用[g] sub()使用awk。

相關問題