oiooiooioiioooiioiioiooo
Goto Top

Mit Linux Konsole Absatz 0A in Dateien suchen und ersetzen

Moin,

jedes mal das gleiche. Ein mal im Jahr brauche ich einen Script und jedes mal stoße ich auf neue Probleme mit alten Wurzeln.

Die Absätze…..

Mit Linux am ende einer Datei eine Leerzeile einfügen

Ich habe eine Datei. Mit Adressen. Dummerweise gab es mal einen Entwickler Team welches ein PayPal Modul entwickelte, bei dem die Adresse bei einem Zusatz (also zweitem Feld für Straße) die beiden Felder Trennt nur 1 und zwar laut dem Hexeditor ein Absatz „0A“ Alle anderen werden ganz normal und vorbildlich mit „0D 0A“ umgesetzt.

hexmex

Nun muss ich für meinen anderen Script die Datei vorbereiten und diesen Zeilenumbruch entfernen und mit zum Beispiel einem Leerzeichen oder Pipe ( | ) ersetzen.

Ich kann jedoch diesen Absatz in der Konsole weder finden, noch ersetzen.

HEX:

46 69 72 6D 61 31 3B 4E 61 6D 65 31 3B 4E 61 6D 65 32 3B 53 74 72 61 DF 65 31 3B 53 74 72 61 DF 65 32 3B 50 4C 5A 3B 4F 72 74 3B 52 45 2D 4E 75 6D 6D 65 72 3B 54 65 6C 4E 75 6D 6D 65 72 3B 65 72 76 69 63 65 3B 4B 6F 6D 6D 65 6E 74 61 72 3B 4C 61 65 6E 64 3B 42 65 73 74 65 6C 6C 6E 72 0D 0A 46 69 72 6D 61 3B 4D 2E 20 4D 75 73 74 65 72 6E 61 6D 65 3B 3B 41 6D 20 55 66 65 72 6C 61 6E 64 20 31 32 33 2C 20 47 65 62 2E 20 41 34 0A 5A 75 73 61 74 7A 6B 6F 6D 6D 65 6E 74 61 72 3B 3B 31 32 33 34 35 3B 4D FC 6E 63 68 65 6E 3B 42 4C 41 42 4C 41 3B 3B 3B 3B 44 45 3B 42 6C 75 70 42 6C 75 70 0D 0A 46 69 72 6D 61 32 3B 4B 75 6E 64 65 3B 3B 53 74 72 61 73 73 65 20 31 32 30 3B 3B 32 33 39 36 36 3B 4B 6F 65 6C 6E 3B 41 4C 42 41 4C 42 3B 30 30 30 30 30 30 30 30 30 30 30 3B 3B 3B 44 45 3B 50 6C 75 62 50 6C 75 62 0D 0A

Folgendes habe ich bis her probiert:

sed "s/\r/123456789/g" 2019-05-08_09-00-25.csv  

find 2019-05-08_09-00-25.csv -type f -print0 | xargs -0 grep -e "\r"  

Habt Ihr eine Idee für mein Problem?

Sonnst sonniges Wochenende euch noch.

Ich

Content-Key: 455476

Url: https://administrator.de/contentid/455476

Printed on: April 23, 2024 at 22:04 o'clock

Member: colinardo
Solution colinardo May 25, 2019, updated at May 27, 2019 at 09:27:12 (UTC)
Goto Top
Servus,
die beiden Felder Trennt nur 1 und zwar laut dem Hexeditor ein Absatz „0A“ Alle anderen werden ganz normal und vorbildlich mit „0D 0A“ umgesetzt.
Das eine ist ein ganz normaler LF (0A) wie er unter Linux üblich ist, das andere ist das CRLF (0D0A) das unter Windows/DOS den Zeilenumbruch darstellt. Es gibt hier also kein "unnormal" da hat nur einer Unix und DOS Zeilenumbrüche gemixt.

Das zu ersetzen ist aber kein Problem und lässt sich bspw. mit sed erledigen:
sed -Ee ':a;N;$!ba;s/([^\r])\n/\1 /g' "2019-05-08_09-00-25.csv" >new.csv  
Zur Erläuterung der sed Parameter:

  • :a definiert einen Label
  • N Aktuelle und nächste Zeile in den Pattern-Space laden
  • $!ba springe solange zu Label :a bis das Ende der Datei erreicht ist
  • Es befindet sich nun der ganze Text der Datei im Pattern-Space und auf diesen wird die folgende Replace-Aktion angewendet:
  • s/([^\r])\n/\1 /g : Ersetzt alle Unix-Zeilenumbrüche (0A) mit einem Leerzeichen "ohne dabei das 0A in den vorhandenen DOS-Zeilenumbrüchen(0D0A) zu ersetzen".

Bei solchen Operationen, also den hin und her übertragen zwischen Linux und Windows sollte man bei der Übertragung und dem Handling in Texteditoren höllisch aufpassen, dass dieser nicht automatische Ersetzungen der Zeilenumbrüche ungefragt vornimmt. Außerdem sollte man mit Datentransfer-Tools aufpassen und den Binary-Modus statt dem Texttransfer-Modus verwenden da ansonsten Zeilenumbrüche auch automatisch angepasst werden können.
Das kann nämlich alles zu allgemeiner Verunsicherung führen.

Grüße Uwe
Member: OIOOIOOIOIIOOOIIOIIOIOOO
OIOOIOOIOIIOOOIIOIIOIOOO May 27, 2019 updated at 07:50:08 (UTC)
Goto Top
Moin Uwe,

danke dir viel mals für die ausführliche Erklärung. Nach dem ich in deinem Code das $! vor dem ba hinzugefügt habe, hat es auch funktioniert.

Des weiteren wurde mir noch, scheinbar das Grundwissen "Gruppierung" erläutert. Ich hoffe ich behalte es für das nächste Jahr face-smile

Wir haben den Code noch etwas erweitert, in dem wir das falsch positionierte Feld in die richtige Spalte hinzugefügt haben.

sed -i -Ee ':a;N;$!ba;s/([^\r])\n([^;]*);/\1;\2/g' 2019-05-19_*.csv  

Euch allen einen guten Start in die Woche.

Ich
Member: colinardo
colinardo May 27, 2019 updated at 07:44:10 (UTC)
Goto Top
Zitat von @OIOOIOOIOIIOOOIIOIIOIOOO:

Moin Uwe,

danke dir viel mals für die ausführliche Erklärung. Nach dem ich in deinem Code das $! vor dem ba hinzugefügt habe, hat es auch funktioniert.
Uups, da habe ich wohl aus versehen ein Cut zum Erklärtext statt einem Copy gemacht face-smile. Ist korrigiert.
Member: OIOOIOOIOIIOOOIIOIIOIOOO
OIOOIOOIOIIOOOIIOIIOIOOO May 27, 2019 at 08:29:03 (UTC)
Goto Top
Eine Frage habe ich doch noch.

Wofür steht das E nach dem sed --Ee ?
Member: colinardo
colinardo May 27, 2019 updated at 08:42:13 (UTC)
Goto Top
Extended Regular Expressions

sed --help oder man sed verrät es dir übrigens auch genauso wie die manpage

http://www.gnu.org/software/sed/manual/sed.html#Command_002dLine-Option ...
Member: OIOOIOOIOIIOOOIIOIIOIOOO
OIOOIOOIOIIOOOIIOIIOIOOO May 27, 2019 at 09:13:56 (UTC)
Goto Top
hmm komisch, bei mir unter man sed gibt es diese Funktion nicht.

(Centos 7)

Der Script läuft und das ist die Hauptsache.

Viele Dank
Member: colinardo
colinardo May 27, 2019 updated at 09:27:58 (UTC)
Goto Top
Alternativen sind -r oder --regexp-extended. Je nach Distro ist der Einsatz nötig damit sed submatches und erweiterte Regex-Funktionen nutzen kann, kommt aber darauf an welchen Posix Standard die Distro gerade konfiguriert hat.