Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

Hallo,

keine Ahnung, ob ich hier richtig bin, oder das eher irgendwo in die Algorithmik gehört, aber ein Mod kann's ja ggf. verschieben. Vorweg, ich habe mich bis gestern mit sed nie beschäftigt, also verzeiht wenn ich als Anfängerin da Dinge übersehe.

Ich habe mir eine Datei aus einer Datenbank heraus erstellen lassen, die in etwa folgendermaßen aussieht:

SQL>

SQL>    SELECT MITARBEITER, VORNAME, NAME FROM Tabelle;

^LMITARBEITER;VORNAME                                 ;NAME

       <ID>;<Vorname>                               ;<Name>

       <ID>;<Vorname>                               ;<Name>

       <ID>;<Vorname>                               ;<Name>

[Noch gaaaaanz viele Datensätze]

SQL>

SQL> SPOOL OFF
Daraus soll mal, wenn sie groß ist, eine simple csv-Datei werden mit ausschliesslich nur noch:
<ID>;<Vorname>;<Name>

<ID>;<Vorname>;<Name>

<ID>;<Vorname>;<Name>

<ID>;<Vorname>;<Name>

[Wieder irre viele Datensätze]

Jetzt habe ich bereits herausgefunden, wie ich mit sed die ersten und letzten Zeilen + Tabellenkopf entferne, so dass ich nur noch die Datensätze sehe und wie ich die ersten Leerzeichen trimme, so dass die ID direkt am Zeilenanfang steht. Nun stehe ich aber vor dem Problem, dass ich die weiteren Bereiche der Zeilen noch trimmen will.

Das Beispiel oben ist nur mit drei Spalten. Das können natürlich unterschiedlich viele sein. Ich brauche also eine Idee, wie ich sed sagen kann:

  • Gehe zum ersten Semikolon
  • Gehe dann zurück zum Wortende des letzten Wortes (Kann ja auch sein, das der Name oder ein anderer Datensatz aus mehr Worten besteht und Leerzeichen enthält)
  • Lösche alle in diesem Zwischenraum liegenden Leerzeichen
  • Wiederhole diese Schritte bei allen weiteren Semikolons (-kolen?), bis Du am Zeilenende angekommen bist

Bisher habe ich nur Beispiele gefunden, wie ich Leerzeichen am Anfang einer Zeile lösche und am Ende. Aber nicht mitten drin.

Was ich rausfand war, dass es ein positive lookbehind gibt, d.h. dass ich mit (?<=\B) eigentlich sagen können müsste "Gehe zurück zum letzten Wortende". Nur wie sag ich ihm von wo und - vor allen Dingen - wie sage ich ihm quasi als Schleife (while Zeilenende = false...do), dass er das beständig bis zum Zeilenende wiederholen soll?

Hat einer eine Idee? Eigentlich klingt das nach ner super Übungsaufgabe für sed, aber bisher habe ich wie gesagt nur gefunden, dass ich mit

sed -e 's/^[ \t]*//'

die Anfangszeilen trimmen kann und mit

sed 's/^[ \t]*//;s/[ \t]*$//'

das am Anfang wie auch am Ende machen kann. Dazwischen ist mir aber weit wichtiger. *g*

Vielen Dank schonmal im Voraus. :)

Ich kenn mich jetzt nicht mit sed aus, aber wenn es nicht sed sein muss, sondern auch perl geht, würde folgendes deine Leerzeichen entfernen:

perl -e 'while(<STDIN>) { [B]s/(?<=\s+(?=([^;]+))//g[/B]; print; }'[/CODE]




Wobei die Daten über die Standardeingabe übergeben werden, zum Beispiel folgendermaßen:

[CODE]cat <DATEI> | <Perlaufruf>

Andererseits kannst du vll auch den RegExp (fett makiert) für sed benutzen.

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.