reinhardweber
Goto Top

Regex und sed

Hallo zusammen! Bitte um eure Hilfe bei einer Textmanipulation in der bash shell. Ich versuche seit Stunden vergeblich via regex und sed aus

Kostenstelle;AAAAAA
0677/1111111;-9,58;0,00;0,00;2,91;0,00;-6,67;0,00;0,00
Kostenstelle;BBBBBB
0677/2222222;-12,19;0,00;0,00;2,91;0,00;-9,28;0,00;0,00

diesen Text zu generieren

AAAAAA;0677/1111111;-9,58;0,00;0,00;2,91;0,00;-6,67;0,00;0,00
BBBBBB;0677/2222222;-12,19;0,00;0,00;2,91;0,00;-9,28;0,00;0,00

Danke fürs lesen und eure kreativen Ideen ;)

Content-ID: 771222606

Url: https://administrator.de/forum/regex-und-sed-771222606.html

Ausgedruckt am: 09.04.2025 um 22:04 Uhr

maretz
maretz 22.06.2021 um 21:35:01 Uhr
Goto Top
Also - du willst am ende nur wenn eine Zeile _NICHT_ mit 0-9 anfängt am Ende das Return entfernen?
Oder sind die Beispiele einfach nur schlecht gewählt? Weil letzteres dürfte nich soo schwer sein (mit ner if-abfrage - einfach zeilenweise durch die Datei durchgehen, wenn erfüllt am ende das Return entfernen).
it-fraggle
it-fraggle 22.06.2021 um 22:00:06 Uhr
Goto Top
Was steht denn wirklich an Stelle von AAAAAA bzw. BBBBBB. Sind das zig verschiedene Möglichkeiten oder nur eine Hand voll?
colinardo
Lösung colinardo 22.06.2021 aktualisiert um 23:10:57 Uhr
Goto Top
Servus, und willkommen auf Administrator.de!
Mal schnell für dich am Smartphone zusammengetippelt ...
sed -re '{N; s/^Kostenstelle;([^\r\n]+)[\r\n]*/\1;/}' test.txt >test_out.txt  
Grüße Uwe
(der sich jetzt die Finger entknoten muss)
HanTrio
HanTrio 22.06.2021 aktualisiert um 23:02:09 Uhr
Goto Top
Mal ein wenig rumgespielt:

Das folgende Script liest aus "test.txt" (deiner Ausgangsdatei) und schmeißt "test3.txt" am Ende raus:

#!/bin/bash
sed 's/Kostenstelle;//g' test.txt > test2.txt  
paste -d ";" - - < test2.txt > test3.txt  

Das sed ersetzt "Kostenstelle;" (mit dem Semikolon!) mit nichts, im gesamten file, und speichert es zwischen in test2.txt
Darin steht Folgendes:
AAAAAA
0677/1111111;-9,58;0,00;0,00;2,91;0,00;-6,67;0,00;0,00
BBBBBB
0677/2222222;-12,19;0,00;0,00;2,91;0,00;-9,28;0,00;0,00

test2.txt wird nun als Input für "paste" genommen.
"-" ist hier der Input, und durch das zweimalige Verwenden "- -" werden eben immer zwei Zeilen genommen, aneinander gehängt und durch den Separator ";" getrennt.
Der Output (also jew. 2 Zeilen, die nun in einer zusammengefasst sind) kommt dann in test3.txt:

AAAAAA;0677/1111111;-9,58;0,00;0,00;2,91;0,00;-6,67;0,00;0,00
BBBBBB;0677/2222222;-12,19;0,00;0,00;2,91;0,00;-9,28;0,00;0,00

Es fällt mir ein wenig schwer, den paste-Teil richtig zu erklären.. aber er ist auch schamlos geklaut :D
https://stackoverflow.com/questions/9605232/how-to-merge-every-two-lines ...
reinhardweber
reinhardweber 23.06.2021 um 20:43:35 Uhr
Goto Top
Hallo und vielen Dank an colinardo (hoffe der Fingerknoten hat sich gelöst) und HanTrio für eure Ideen! Dank eurer Hilfe konnte ich das Problem mittels sed und dem mir bis dato unbekannten Zeilenpuffer N lösen!

Beste Grüße und nochmals Danke für die super Hilfe! Reinhard
colinardo
colinardo 23.06.2021 um 22:14:21 Uhr
Goto Top
Immer gerne 👍.