staging.inyokaproject.org

Shell String zerschneiden

Status: Gelöst | Ubuntu-Version: Server 16.04 (Xenial Xerus)
Antworten |

gnude

Avatar von gnude

Anmeldungsdatum:
11. Juli 2014

Beiträge: 843

Hallo

ich möchte gerne einen String zerschneiden und die Leerzeichen durch ; ersetzten. Allerdings muss ich den String von vorne und hinten abschneiden. Problem ist.... Die ersten 2 Werte sind Fest, dann kann ein Bereich mit mehreren Worten kommen wo das Leerzeichen o ist und die letzten 6 Leerzeichen sind wieder fix.

Zwei Beispiele

A B C Das ist der Text E F W F G

oder

A B C Das ist ein etwas längerer Text E F W F G
}}
Der mittlere Text soll in seinem Feld. Es soll im prinzip eine CSV Datei herauskommen

{{{
A;B;C;Das ist der Text;E;F;W;F;G
A;B;C;Das ist ein etwas längerer Text;E;F;W;F;G

Bearbeitet von sebix:

Bitte verwende in Zukunft Codeblöcke, um die Übersicht im Forum zu verbessern!

Seebär

Avatar von Seebär

Anmeldungsdatum:
2. Mai 2009

Beiträge: 833

Um in der shell mit Strings zu hantieren gibt es diverse Optionen

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Ich würde da lieber Python3 auspacken:

1
2
3
4
5
6
7
#!/usr/bin/env python3
import fileinput

for line in fileinput.input():
    *leading, rest = line.split(maxsplit=3)
    text, *ending = rest.rsplit(maxsplit=5)
    print(';'.join((*leading, text, *ending)))
$ python3 reorganize.py << EOF
A B C Das ist der Text E F W F G
A B C Das ist ein etwas längerer Text E F W F G
EOF
A;B;C;Das ist der Text;E;F;W;F;G
A;B;C;Das ist ein etwas längerer Text;E;F;W;F;G 

Edit: an einer Stelle verzählt und den zweiten Split an der falschen Variable gemacht, jetzt sollte es passen.

gnude

(Themenstarter)
Avatar von gnude

Anmeldungsdatum:
11. Juli 2014

Beiträge: 843

Was soll ich sagen ... die perfekte Lösung ! 👍 👍

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

Wobei das nicht nur Leerzeichen, sondern auch anderen Whitespace (wie z.B. Tabs) erfasst - wenn es nur Leerzeichen treffen soll, kannst du das als erstes Argument angeben - und da das Zeilenende dann nicht mehr automatisch entfernt wird, muss man print noch sagen, dass es kein Newline-Zeichen anhängen soll:

1
2
3
4
5
6
7
#!/usr/bin/env python3
import fileinput

for line in fileinput.input():
    *leading, rest = line.split(' ', maxsplit=3)
    text, *ending = rest.rsplit(' ', maxsplit=5)
    print(';'.join((*leading, text, *ending)), end='')
$ python3 print_csv.py << EOF
A B C Das ist der Text E F W F G
A B C Das ist ein etwas längerer Text E F W F G
EOF
A;B;C;Das ist der Text;E;F;W;F;G
A;B;C;Das ist ein etwas längerer Text;E;F;W;F;G 
Antworten |