2016-08-05 22 views
-3

Ich habe ein Problem mit meiner Regex für sed. Es scheint, dass die Gruppierung nicht richtig funktioniert und ich kann nicht herausfinden warum.sed Substitution (s) Gruppierung funktioniert nicht

habe ich versucht, diese und viele Derivate dieses Befehls:

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

auf dieser Zeichenfolge (Datei) [Achtung: das ‚>‘ von dieser Form entfernt wurden, und vor jedem TRINITY, Linien sind alternierende ID (>TRINITY usw.) und Sequenzen (Großbuchstaben, mit Sternchen) Zeilenumbrüche (-> hier Raum) fehlen]:

>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 

ich mag von der Mitte zu befreien: ‚_path =‘ bis zum letzten '_'

Was fehlt mir?

+0

Es sieht aus wie Sie nicht markieren Sie beantwortet die Frage, aber aufgegeben haben diese question-- von dem, was ich in einem Kommentar zu lesen. Ich hoffe, dass meine Lösung tatsächlich hilfreich ist, ich verschwende in letzter Zeit Zeit mit SO. – SaintHax

Antwort

0

Es gibt zu viele Regex-Sets :(Versuchen Sie dies, ich entfernte die zweite Gruppierung, b/c, wenn Sie nur den mittleren Teil entfernen möchten, Sie brauchen es nicht. Der Schalter bewirkt nur, was zusammenpasst. Ich versuche, starke Anführungszeichen zu verwenden, es sei denn, es gibt einen Grund, dies nicht zu tun.

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

Aus einer Zeile wie folgt: >TRINITY_DN41806_c0_g1_i1_len=213_path=[245:0-129_246:130-147_247:148-212]_[-1,_245,_246,_247,_-2]_1 NSIAP

ich dieses: >TRINITY_DN41806_c0_g1_i1_len=2131 NSIAP

Mit heraus ein Beispiel für Ihre erwartete Leistung, muss ich vertraue ich richtig Ihre Erklärung lesen.

edit: Ich hatte kein Glück \ w und \ d mit erweiterten regex sed die mit

+0

Toller Job, aber sed scheint ein bisschen seltsam. Ich werde es wahrscheinlich nicht wieder benutzen. – Aquaplant

+0

Sie werden feststellen, dass es mehrere Versionen von Regex gibt. Es ist Regex, das ist komisch - wenn Sie zwischen verschiedenen Anwendungen wechseln :( – SaintHax

0

Nun, ich habe es in Python versucht, und es scheint, dass Ihre Regexp Ok ist mit Ausnahme der letzten $. Hier ist mein Versuch:

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

ich entfernt die unnötigen Zeichensätze. Das Problem war, dass die $ das Ende der Zeichenfolge bezeichnet, was nicht wahr ist, da das Muster die Ziffer nach dem letzten Unterstrich erfasst, der nicht das Ende der Zeichenfolge ist.

Die regexp kann auch kürzer sein:

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

[^=]+ alle Symbole nehmen, die nicht =

= dann die = Zeichen

.*_ dann alles bis zum letzten Strich

(\d) dann eine Ziffer

+0

Danke, das ist eine bessere Lösung. Ich habe meine Regex mit Hilfe von Pythex validiert und es gab kein Problem mit dem EOL - trotzdem habe ich es schon ohne '$' versucht. Leider funktioniert das auch nicht.Ich habe jetzt eine Lösung mit awk gefunden. – Aquaplant

Verwandte Themen