Ce problème est lié à ma tentative d'importer des questions et leurs réponses dans un fichier Excel dans un fichier .txt que le programme de carte mémoire Anki gère comme décrit ici.
Je ne peux pas avoir plus de 2 champs, je dois donc faire des options dans un champ .
Données stockées au format CSV à partir de LibreOffice (point-virgule comme séparateur de champs - ne faites que distinguer ce que dit le manuel) comme indiqué dans le manuel 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
...
où chaque entrée avec toutes les options est sur une ligne, c'est-à-dire une "flashcard". Dans une carte, le recto avant le point-virgule et le verso après le point-virgule. Deuxième flashcard dans la nouvelle ligne et ainsi de suite.
Sortie souhaitée qui doit être en 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
...
Mon pseudocode en Perl basé sur cette réponse
perl -00 -pe s/;/\0/; s/;/ |/g; s/\0/;/' file
Commenté
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
Comment pouvez-vous remplacer tous les points-virgules après le 1er point-virgule ?
Réponse acceptée :
sed 'y/|;/\n|/;s/|/;/;y/\n/|/' <<\IN
Question ipsun; option 1 ; option 2 ; option 3 ; option 4 ; ... ; option n
IN
Notez que cela ne fait pas utilise une expression rationnelle pour gérer la majorité des remplacements, mais utilise plutôt un plus basique (et beaucoup plus performant) traduction fonction pour le faire - et le fait de manière portable POSIX. Cela devrait fonctionner sur n'importe quelle machine avec un sed
POSIX installé.
Il traduit ;
points-virgules en |
tuyaux et |
tuyaux vers \n
ewlines simultanément. Le |
les canaux sont mis de côté en tant que \n
ewlines en cas d'occurrence sur une ligne d'entrée. Il s///
remplace le premier |
pipe pour un ;
point-virgule, puis traduit tous les \n
ewlines à |
pipes - restaurant ainsi tout ce qu'il aurait pu mettre de côté pour gérer de manière robuste les seuls s///
substitution.
Pendant que j'utilise un <<\IN
here-document à des fins de démonstration copier/coller, vous devriez probablement utiliser <infile >outfile
.
SORTIE :
Question ipsun; option 1 | option 2 | option 3 | option 4 | ... | option n