GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie ersetze ich alle Semikolons nach dem ersten?

Dieses Problem hängt mit meinem Versuch zusammen, Fragen und ihre Antworten in einer Excel-Datei in eine .txt-Datei zu importieren, die das Anki-Flashcard-Programm wie hier beschrieben handhabt.
Ich kann nicht mehr als 2 Felder haben, also muss ich Optionen zu einem Feld machen .

Daten gespeichert als CSV von LibreOffice (Semikolon als Feldtrenner – nur Unterscheidung, was im Handbuch steht) wie im Anki-Handbuch beschrieben

Question ipsun; option 1 ; option 2 ; option 3 ; option 4 ; ... ; option n
Question ipsun; option 1 ; option 2 ; option 3 ; option 4 ; ... ; option n
...

wobei jeder Eintrag mit allen Optionen in einer Zeile steht, also eine „Lernkarte“. Auf einer Karte vorderer Teil vor dem Semikolon und hinterer Teil nach dem Semikolon. Zweite Karteikarte in Zeilenumbruch und so weiter.

Gewünschte Ausgabe, die in UTF-8 sein sollte

Question ipsun; option 1 | option 2 | option 3 | option 4 | ... | option n
Question ipsun; option 1 | option 2 | option 3 | option 4 | ... | option n
...

Mein Pseudocode in Perl basierend auf dieser Antwort

perl -00 -pe s/;/\0/; s/;/ |/g; s/\0/;/' file

Kommentiert

perl -00 -pe '   # each record is separated by blank lines (-00)
                 # read the file a record at a time and auto-print (-p)
    s/;/\0/;    # turn the first semicolon into a null byte
    s/;/ |/g;     # replace all other semicolons with " |"
    s/\0/;/     # restore the first semicolon
' file

Wie können Sie alle Semikolons nach dem 1. Semikolon ersetzen?

Akzeptierte Antwort:

sed 'y/|;/\n|/;s/|/;/;y/\n/|/' <<\IN
Question ipsun; option 1 ; option 2 ; option 3 ; option 4 ; ... ; option n
IN

Beachten Sie, dass dies nicht der Fall ist Verwenden Sie einen regulären Ausdruck, um den Großteil der Ersetzungen zu handhaben, sondern verwenden Sie einen einfacheren (und weitaus leistungsfähigeren) Übersetzung Funktion dazu – und zwar in einer POSIX-portablen Art und Weise. Dies sollte auf jeder Maschine mit einem POSIX sed funktionieren installiert.

Es übersetzt ; Semikolons zu | Pipes und | Pipes zu \n ewlines gleichzeitig. Der | Rohre werden als \n reserviert ewlines falls welche in einer Eingabezeile auftreten. Es ist dann s/// ersetzt den ersten vorkommenden | Pipe für einen ; Semikolon und übersetzt dann alle \n ewlines zu | Pipes – und stellt so alle wieder her, die es möglicherweise beiseite gelegt hat, um die einzelnen s/// robust zu handhaben Ersatz.

Während ich einen <<\IN verwende here-document zum Zweck des Kopierens/Einfügens zu demonstrieren, sollten Sie wahrscheinlich <infile >outfile verwenden .

AUSGABE:

Question ipsun; option 1 | option 2 | option 3 | option 4 | ... | option n

Linux
  1. So entfernen Sie alle Dateien in einem Ordner außer einer bestimmten Datei in Linux

  2. Wie integriere ich den Mv-Befehl nach dem Find-Befehl?

  3. Wie ersetzt man ein Zeichen durch ein anderes in allen Dateinamen der aktuellen Verzeichnisse?

  4. So listen Sie alle angemeldeten Benutzer auf

  5. So ersetzen Sie alle Vorkommen eines Wortes in allen Dateien in der Linux-Befehlszeile

So listen Sie alle Datenbanken in PostgreSQL auf

Wie verschiebt man alle Dateien (einschließlich versteckter) von einem Verzeichnis in ein anderes?

Wie verschiebt (und überschreibt) man alle Dateien von einem Verzeichnis in ein anderes?

Wie führe ich einen Befehl aus, nachdem ein bereits laufender, bestehender beendet wurde?

So ersetzen Sie den gesamten Inhalt eines Ordners durch einen anderen

Wie bekomme ich die n-te Zeile nach einer gruppierten?