GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo reemplazar todos los puntos y comas después del primero?

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

Linux
  1. Cómo eliminar todos los archivos de una carpeta excepto un archivo específico en Linux

  2. ¿Cómo mover todos los archivos (incluidos los ocultos) de un directorio a otro?

  3. Cómo reemplazar múltiples espacios por una pestaña

  4. ¿Cómo puedo cambiar todos los archivos que pertenecen a un usuario a otro usuario?

  5. ¿Cómo ejecutar un comando después de que finalice uno existente que ya se está ejecutando?

Cómo enumerar todas las bases de datos en PostgreSQL

Cómo eliminar todos los contenedores de Docker

Cómo reemplazar todo el contenido de una carpeta con otra

¿Cómo mejorar todos los subprocesos (y niños) de un proceso en Linux?

Cómo deshabilitar una CPU

Cómo salir de todos los procesos de supervisor si uno salió con 0 resultados