2016-08-05 77 views
-3

我對sed的正則表達式有問題。看起來分組無法正常工作,我找不到原因。sed替代(s)分組不起作用

我嘗試這樣做,這個命令的許多衍生物:

sed -er "/s/^(\>[\w\d]+\=[\d]+)_.+\]_([\d])$/\1\2/" test.fa 

此字符串(文件)[注意:在「>」通過這種形式中刪除,並且在每一個TRINITY的前面,線被交替ID(>TRINITY等)和序列(大寫字母,有星號)換行符( - >這裏空間)丟失]:

>TRINITY_DN41792_c0_g3_i1_len=553_path=[700:0-121_707:122-163_706:164-240_694:241-552]_[-1,_700,_707,_706,_694,_-2]_3 KMA 
>TRINITY_DN41806_c0_g1_i1_len=213_path=[245:0-129_246:130-147_247:148-212]_[-1,_245,_246,_247,_-2]_1 NSIAP 
>TRINITY_DN41806_c0_g1_i1_len=213_path=[245:0-129_246:130-147_247:148-212]_[-1,_245,_246,_247,_-2]_2 TQ*LHIL 
>TRINITY_DN41806_c0_g1_i1_len=213_path=[245:0-129_246:130-147_247:148-212]_[-1,_245,_246,_247,_-2]_3 LNS 
>TRINITY_DN41788_c0_g1_i1_len=188_path=[208:0-97_209:98-128_210:129-152_211:153-187]_[-1,_208,_209,_210,_211,_-2]_1 
*KLCT 
>TRINITY_DN41788_c0_g1_i1_len=188_path=[208:0-97_209:98-128_210:129-152_211:153-187]_[-1,_208,_209,_210,_211,_-2]_2 ENCA 
>TRINITY_DN41788_c0_g1_i1_len=188_path=[208:0-97_209:98-128_210:129-152_211:153-187]_[-1,_208,_209,_210,_211,_-2]_3 KI 
>TRINITY_DN41788_c0_g2_i1_len=167_path=[212:0-97_213:98-128_214:129-152_215:153-166]_[-1,_212,_213,_214,_215,_-2]_1 
*KLCT 
>TRINITY_DN41788_c0_g2_i1_len=167_path=[212:0-97_213:98-128_214:129-152_215:153-166]_[-1,_212,_213,_214,_215,_-2]_2 ENC 
>TRINITY_DN41788_c0_g2_i1_len=167_path=[212:0-97_213:98-128_214:129-152_215:153-166]_[-1,_212,_213,_214,_215,_-2]_3 KIVH 
>TRINITY_DN41788_c1_g1_i1_len=183_path=[154:0-182]_[-1,_154,_-2]_1 YGS 
>TRINITY_DN41788_c1_g1_i1_len=183_path=[154:0-182]_[-1,_154,_-2]_2 TDPRTVP 
>TRINITY_DN41788_c1_g1_i1_len=183_path=[154:0-182]_[-1,_154,_-2]_3 RIPGQF 

我想擺脫中間的:「_path =」到最後'_'

我錯過了什麼?

+0

看起來你並不標誌着你的問題回答沒有運氣,但已經放棄從我在評論閱讀本question--。我希望我的解決方案實際上有幫助,我似乎最近在這裏浪費時間。 – SaintHax

回答

0

有太多的正則表達式:(試試這個,我刪除了第二個分組,如果你只想刪除中間部分,你不需要它。交換機只會影響匹配的內容。除非有原因,否則我會嘗試使用強引號,而不是雙引號。

sed -r 's/(^>.*=[0-9]+)_.+\]_/\1/' test.fa

從這樣一行: >TRINITY_DN41806_c0_g1_i1_len=213_path=[245:0-129_246:130-147_247:148-212]_[-1,_245,_246,_247,_-2]_1 NSIAP

我得到這個: >TRINITY_DN41806_c0_g1_i1_len=2131 NSIAP

隨着你的預期輸出的一個例子,我必須相信我正確地讀你的解釋。

編輯:我不得不使用\ w和\ d使用sed的擴展正則表達式

+0

偉大的工作,但sed似乎有點奇怪。我可能不會再使用它。 – Aquaplant

+0

你會注意到有幾個版本的正則表達式。這是一個奇怪的正則表達式 - 當你使用不同的應用程序切換:( – SaintHax

0

嗯,我在Python中試過了,看起來你的正則表達式是正常的,除了最後的$。 這裏是我的嘗試:

"^(\>\w+\=\d+)_.+\]_(\d)" 

我刪除了不必要的字符集。 問題在於$指定字符串的結尾,這是不正確的,因爲該模式捕獲最後一個底碼後面的數字,而不是字符串的結尾。

的正則表達式,甚至更短:

"([^=]+=\d+).*_(\d)" 

[^=]+採取不所有的符號=

=然後採取=標誌

.*_然後一切,直到最後一個下劃線

(\d)然後一個數字

+0

謝謝,這是一個更好的解決方案。我在Pythex的幫助下驗證了我的正則表達式,並且EOL沒有問題 - 但是我已經嘗試了它,但沒有使用'$'。不幸的是,這也不起作用。我現在用awk找到了一個解決方案。 – Aquaplant