Geier0815 schrieb:
Wahrscheinlich schlägt robi hier nachher auf und lacht uns aus und zeigt uns dann einen ganz einfachen Weg per Befehl oder Option enes Befehls /dieden wir noch nicht kannten... :schockiert:
mit sed geht sowas wirklich ist aber "Gewurschtel" da man wahrscheinlich über Multilinebearbeitung gehen muss. Das wird wunderbar kryptisch, da blickt niemand durch um sowas dann später für seine eigenen Aufgaben abzuwandeln.
TomcatMJ schrieb:
Würde mich auch nicht wundern wenn dann jemand mit AWK kommt (von dem ich bis dato erfolgreich die Finger lassen konnte*G*)...
hier sind wir Richtig.

Unter der Voraussetzung das wir bei der Bearbeitung das \r und das \n an den entsprechenden Stellen stehen lassen wollen, geht das im Prinzip so hier.
Erstmal als NULL-Bearbeitung
Code:
awk 'BEGIN{RS="[\r\n]"};{ ORS=RT;print $0 }' datei
Das Prinzip ist folgendes: mit der Variable
RS definieren wir beides als möglichen Eingabe-Zeilentrenner.
In jeder Zeile steht dann jeweils in der Variable
RT welcher der beiden Trenner diese Zeile hatte.
Wir setzten jetzt die Variable
ORS die den Ausgabezeilentrenner bestimmt, auf den jeweiligen aktuellen Wert von
RT , und printen.
und fertig ist der Kuchen.
Nun sollen wir nur die Zeilen bearbeiten die auf \r enden und zwar wollen wir jedes vorkommen von "HALLO" zu "ECHO" ändern, und zwar nur in den Zeilen die auf \r enden. Wir können also pro Zeile entweder die Variable RT oder ORS auswerten um zu sehen welchen Zeilentrenner diese Zeile hatte (und auch wiederbekommt)
Code:
awk 'BEGIN{RS="[\r\n]"};{ ORS=RT;if (ORS=="\r") { $0 = gensub("HALLO","ECHO","g")}; print }' datei
das Austauschen ist hier ein bisschen komplizierter als in sed, hier wurde jetzt mal das universelle "gensub" verwendet, das lässt sich auf fast alle Varianten anwenden und zeigt die prinzipielle Benutzung.
Funktionen die hier zB möglich sind.
gensub(r,s[,h[,t]]) Ersetzt r in t durch s, gibt Ergebnis zurück; h="g/G"(global) oder Zahl(=Position), sonst nur 1. Position; t bleibt unver ändert, ohne t wird $0 verwendet; () ist in r und \1-\9 ist in s verwendbar
gsub(r,s[,t]) Ersetzt überall in t durch s; gibt Anzahl Ersetzungen zurück ohne t wird $0 verwendet [global]
sub(r,s[,t]) Wie gsub, ersetzt aber nur die erste Teilkette
Beachten muss man hier die unterschiedlichen Handhabung von gensub und gsub/sub.
gensub verändert
t nicht. und hat die Änderung im Rückgabewert, weshalb wir die oben
$0 wieder zuweisen müssen.
gsub gibt die Anzahl der Ersetzungen zurück und ändert
t .
also würde die gesamte Befelszeile hier noch um einiges einfacher
Code:
awk 'BEGIN{ RS="[\r\n]" };{ ORS=RT; if (ORS=="\r"){ gsub("HALLO","ECHO")};print }'
und wenn man mal spaßeshalber hinten an den Befehl noch "
| hexdump -C" anhängt, wird man erkennen, da ist \n und \r und auch "\n\r" oder "\r\n" noch genauso dasteht, wie in der Ausgangsdatei.
Seltsamerweise bricht man sich bei Problemen mit dem Zeilemsprung beim Programmieren in vielen Scriptsprachen die Finger, außer in awk.
robi