regex und sed ...

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
reinhardweber
Beiträge: 2
Registriert: 22.06.2021 20:26:52

regex und sed ...

Beitrag von reinhardweber » 22.06.2021 20:35:09

Hallo zusammen! Bitte um eure Hilfe bei einer Textmanipulation in der shell. Ich versuche seit Stunden vergeblich :facepalm: 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 ;)

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: regex und sed ...

Beitrag von eggy » 22.06.2021 21:34:43

geht mit awk einfacher

Code: Alles auswählen

awk -F ';' '/Kostenstelle/{K=$2; next} {print K ";" $0}' datei.csv 

eggy
Beiträge: 3331
Registriert: 10.05.2008 11:23:50

Re: regex und sed ...

Beitrag von eggy » 22.06.2021 21:39:15

Erklärung:
mit -F Semikolon als Feldtrennzeichen festlegen
mit $0 bekommt man die aktuelle Zeile, mit $1 bis $irgendwas die Felder
/Kostenstelle/ sagt der folgende Block {...} soll nur angewandt werden wenn das Wort Kostenstelle vorkommt
in dem Block steht dann nimm das hintere Feld und merk es Dir
"next" sorgt dafür, dass nach dem Abarbeiten der Zeile die anderen Regeln übersprungen werden
beim einlesen von Zeilen ohne Wort "Kostenstelle" wird nur der zweite Block abgearbeitet,
da gibt es erst den Inhalt der Variable "K" aus, dann ein ";" und dann $0 - die aktuelle Zeile

awk arbeitet wie sed grundsätzlich Zeilenweise

falls noch was unklar ist, einfach fragen

tobo
Beiträge: 1964
Registriert: 10.12.2008 10:51:41

Re: regex und sed ...

Beitrag von tobo » 22.06.2021 21:45:21

Ansichtssache, was einfacher ist!?

Code: Alles auswählen

$ echo "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" | sed '/^Kostenstelle;/{s/[^;]*;//;N;s/\n/;/;}'
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
Zuletzt geändert von tobo am 22.06.2021 21:48:12, insgesamt 1-mal geändert.

Benutzeravatar
Livingston
Beiträge: 1366
Registriert: 04.02.2007 22:52:25
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: 127.0.0.1

Re: regex und sed ...

Beitrag von Livingston » 22.06.2021 21:45:40

Code: Alles auswählen

sed '
/^Kostenstelle/ {
	N
	s/Kostenstelle;//
	s/\n/;/
}' filename
Also: Wenn Kostenstelle am Zeilenanfang auftaucht (^Kostenstelle)
dann nächste Zeile zusätzlich in den Zeilenpuffer einlesen (N)
danach löschen von Kostenstelle und anschließendem Semikolon,
und zuletzt das Zeilenendezeichen (\n) durch ein Semikolon ersetzen.

EDIT: OK, tobo war 19 sec schneller. :wink:
EDIT2: Ein richtig cooler und anschaulicher Crash-Kurs in sed findet sich hier: https://www.grymoire.com/Unix/Sed.html
Der Hauptunterschied zwischen etwas, was möglicherweise kaputtgehen könnte und etwas, was unmöglich kaputtgehen kann, besteht darin, dass sich bei allem, was unmöglich kaputtgehen kann, falls es doch kaputtgeht, normalerweise herausstellt, dass es unmöglich zerlegt oder repariert werden kann.
Douglas Adams

reinhardweber
Beiträge: 2
Registriert: 22.06.2021 20:26:52

Re: regex und sed ...

Beitrag von reinhardweber » 23.06.2021 20:37:53

Hallo und vielen Dank an eggy, tobo & Livingston für eure Beiträge. Ich hatte erst heute Gelegenheit eure Hilfen umzusetzen. Ich habe mich dann für die sed-Variante entschieden, wobei mir die Möglichkeit mittels N den Zeilenpuffer einzulesen völlig fremd war ;)

Zum Glück lernt man nie aus! Danke nochmals und beste Grüße, Reinhard

Antworten