GNU/Linux >> Linux Esercitazione >  >> Linux

Come sostituire tutti i punti e virgola dopo il primo?

Questo problema è correlato al mio tentativo di importare le domande e le relative risposte in un file Excel in un file .txt che il programma flashcard Anki gestisce come descritto qui.
Non posso avere più di 2 campi, quindi devo impostare le opzioni in un campo .

Dati archiviati come CSV da LibreOffice (punto e virgola come separatore di campo - unica distinzione da ciò che dice il manuale) come indicato nel manuale Anki

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

dove ogni voce con tutte le opzioni è in una riga, ovvero una "flashcard". In una carta, la parte anteriore prima del punto e virgola e la parte posteriore dopo il punto e virgola. Seconda flashcard in newline e così via.

Uscita ricercata che dovrebbe essere in UTF-8

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

Il mio pseudocodice in Perl basato su questa risposta

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

Commentato

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

Come puoi sostituire tutti i punti e virgola dopo il 1° punto e virgola?

Risposta accettata:

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

Nota che questo non usa un'espressione regolare per gestire la maggior parte delle sostituzioni, ma usa invece un più semplice (e molto più performante) traduzione funzione per farlo – e lo fa in modo portatile POSIX. Questo dovrebbe funzionare su qualsiasi macchina con un sed POSIX installato.

Traduce ; punto e virgola su | tubi e | pipe a \n ewline contemporaneamente. Il | le pipe vengono messe da parte come \n ewlines nel caso si verifichino su una riga di input. Quindi s/// sostituisce il primo | che si verifica pipe per un ; punto e virgola, quindi traduce tutto \n ewlines a | tubi – ripristinando così quelli che avrebbe potuto mettere da parte per gestire in modo robusto i singoli s/// sostituzione.

Mentre utilizzo un <<\IN here-document per motivi di copia/incolla, probabilmente dovresti usare <infile >outfile .

USCITA:

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

Linux
  1. Come rimuovere tutti i file in una cartella tranne un file specifico in Linux

  2. Come integrare il comando Mv dopo il comando Trova?

  3. Come sostituire un carattere con un altro in tutti i nomi di file delle directory correnti?

  4. Come elencare tutti gli utenti che hanno effettuato l'accesso

  5. Come spostare (e sovrascrivere) tutti i file da una directory all'altra?

Come elencare tutti i database in PostgreSQL

Come spostare tutti i file (inclusi quelli nascosti) da una directory all'altra?

Come sostituire tutte le occorrenze di una parola in tutti i file nella riga di comando di Linux

Come rimuovere tutti i contenitori Docker

Come eseguire un comando al termine di uno già in esecuzione esistente?

Come ottenere l'ennesima riga dopo una presa?