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