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-Key: 771222606

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

Printed on: September 28, 2023 at 05:09 o'clock

Member: maretz
maretz Jun 22, 2021 at 19:35:01 (UTC)
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).
Member: it-fraggle
it-fraggle Jun 22, 2021 at 20:00:06 (UTC)
Goto Top
Was steht denn wirklich an Stelle von AAAAAA bzw. BBBBBB. Sind das zig verschiedene Möglichkeiten oder nur eine Hand voll?
Member: colinardo
Solution colinardo Jun 22, 2021 updated at 21:10:57 (UTC)
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)
Member: HanTrio
HanTrio Jun 22, 2021 updated at 21:02:09 (UTC)
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 ...
Member: reinhardweber
reinhardweber Jun 23, 2021 at 18:43:35 (UTC)
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
Member: colinardo
colinardo Jun 23, 2021 at 20:14:21 (UTC)
Goto Top
Immer gerne ­čĹŹ.