Naja, ich würde es im ersten Schuss mit folgender regexp machen:
Code: Alles auswählen
Match: ATG(...)*?(TAA|TGA|TAG)
Substitution: ATG#\2
Wenn du Hilfe brauchst, wie man darauf kommt, frag einfach.
Das Problem ist, dass man dafür den non-greedy Quantifier *? benötigt - und den können weder sed noch awk (grep scheidet sowieso aus, weil wir substituieren wollen).
Code: Alles auswählen
$ sed <<<"CGATGCCCTAAGCAATGCCTACGTAGTAATAGATGCCCTAAGCAATGCCTACGTAGTAATAGATGCCCTAAGCAATGCCTACGTAGTAATAGATGCCCTAAGCAATGCCTACGTAGTAATAGATGCCCTAAGCAATGCCTACGTAGTAATAGATGCCCTAAGCAATGCCTACGTAGTAATAG" -r 's/ATG(...)*?(TAA|TGA|TAG)/ATG#\2/g;'
CGATG#TAG
Bäähhh.
Z.B. Tcl liefert ein besseres Ergebnis:
Code: Alles auswählen
$ tclsh <<<'regsub -all {ATG(...)*?(TAA|TGA|TAG)} {CGATGCCCTAAGCAATGCCTACGTAGTAATAGATGCCCTAAGCAATGCCTACGTAGTAATAGATGCCCTAAGCAATGCCTACGTAGTAATAGATGCCCTAAGCAATGCCTACGTAGTAATAGATGCCCTAAGCAATGCCTACGTAGTAATAGATGCCCTAAGCAATGCCTACGTAGTAATAG} {ATG#\2} result ; puts $result'
CGATG#TAAGCAATG#TAGTAATAGATG#TAAGCAATG#TAGTAATAGATG#TAAGCAATG#TAGTAATAGATG#TAAGCAATG#TAGTAATAGATG#TAAGCAATG#TAGTAATAGATG#TAAGCAATG#TAGTAATAG
Sollte das ein Contest sein, verstehe ich die Einschränkung auf grep, sed, awk. Es soll schließlich schwer sein und die offensichtliche Lösung soll nicht funzen.
In einer LPI-Prüfung halte ich die Frage für hinterhältig. Ich würde mit der offensichtlichen Antwort kontern, dass man gefälligst Perl oder Tcl zu installieren habe oder das gefälligst auf einer Maschine macht, wo diese Programme installiert sind. Falls es dafür keine Punkte gibt, kann man sich diese Prüfung dahin schieben, wo keine Sonne hinfällt.
Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.