2017-08-10 8 views
0

Ich habe eine Datei voller Zeilen wie:Ersetzen Zeichen innerhalb einer Zeile mit sed

ATOM 27576 OT2 TYR X 360  33.646 13.165 20.334 1.00 1.00  PROE 

ich es konvertieren wollen wie sein:

ATOM 27576 OT2 TYR E 360  33.646 13.165 20.334 1.00 1.00  PROE 

mit anderen Worten, setzen Sie den letzten Buchstaben von PRO wo X steht. X ist eine Konstante innerhalb der Datei, aber das PRO Postfix variiert. Ist es möglich, dies mit einem einzeiligen sed-Befehl zu erreichen?

Antwort

2

Nur Einfanggruppen verwenden:

sed 's/TYR X \(.*\)PRO\(.*\)$/TYR \2 \1PRO\2/'

 
$ echo "ATOM 27576 OT2 TYR X 360 33.646 13.165 20.334 1.00 1.00 PROE" | sed 's/TYR X \(.*\)PRO\(.*\)$/TYR \2 \1PRO\2/' 
ATOM 27576 OT2 TYR E 360 33.646 13.165 20.334 1.00 1.00 PROE 
1

awk Lösung wäre für einen solchen Fall besser geeignet sein:

awk '{ $5=substr($NF,length($NF)) }1' file 
0

Kreativer Einsatz von Rückreferenzierungen:

sed 's/^\(.\+\) X \(.\+\) \(...\)\(.\)$/\1 \4 \2 \3\4/' 
1

können Sie verwenden diese sed:

sed -i '' -E 's/ X(.*PRO([A-Za-z]))/ \2\1/' file 
ATOM 27576 OT2 TYR E 360 33.646 13.165 20.334 1.00 1.00 PROE 
+1

'-E' erlaubt unescaped Pars. Ich mag die verschachtelten Capture-Gruppen. +1. – stevesliva

Verwandte Themen