Este problema está relacionado con mi intento de importar preguntas y sus respuestas en un archivo de Excel en un archivo .txt que el programa Anki flashcard maneja como se describe aquí.
No puedo tener más de 2 campos, así que necesito hacer opciones en un campo .
Datos almacenados como CSV de LibreOffice (punto y coma como separador de campo; solo distingue lo que dice el manual) como se indica en el manual de 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
...
donde cada entrada con todas las opciones está en una línea, es decir, una "tarjeta flash". En una tarjeta, la parte delantera antes del punto y coma y la parte trasera después del punto y coma. Segunda tarjeta flash en nueva línea y así sucesivamente.
Salida deseada que debería estar 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
...
Mi pseudocódigo en Perl basado en esta respuesta
perl -00 -pe s/;/\0/; s/;/ |/g; s/\0/;/' file
comentado
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
¿Cómo se pueden reemplazar todos los puntos y comas después del primer punto y coma?
Respuesta aceptada:
sed 'y/|;/\n|/;s/|/;/;y/\n/|/' <<\IN
Question ipsun; option 1 ; option 2 ; option 3 ; option 4 ; ... ; option n
IN
Tenga en cuenta que esto no usa una expresión regular para manejar la mayoría de los reemplazos, sino que usa un más básico (y mucho más eficaz) traducción para hacerlo, y lo hace de forma portátil POSIX. Esto debería funcionar en cualquier máquina con un POSIX sed
instalado.
Traduce ;
punto y coma a |
tuberías y |
tuberías a \n
líneas nuevas simultáneamente. El |
las tuberías se reservan como \n
ewlines en caso de que ocurra alguno en una línea de entrada. Entonces s///
sustituye el primer |
que aparece tubería para un ;
punto y coma, y luego traduce todo \n
líneas nuevas a |
tuberías, restaurando así cualquiera que pudiera haber reservado para manejar de manera robusta los s///
individuales sustitución.
Mientras uso un <<\IN
here-document por el bien de la demostración de copiar/pegar, probablemente debería usar <infile >outfile
.
SALIDA:
Question ipsun; option 1 | option 2 | option 3 | option 4 | ... | option n