GNU/Linux >> Tutoriels Linux >  >> Linux

Comment remplacer tous les points-virgules après le 1er ?

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

Linux
  1. Comment supprimer tous les fichiers d'un dossier sauf un fichier spécifique sous Linux

  2. Comment remplacer un caractère par un autre dans tous les noms de fichiers des répertoires actuels ?

  3. Comment remplacer toutes les occurrences d'un mot dans tous les fichiers dans la ligne de commande Linux

  4. Comment remplacer plusieurs espaces par un onglet

  5. Comment exécuter une commande après la fin d'une commande existante déjà en cours d'exécution ?

Comment lister toutes les bases de données dans PostgreSQL

Comment déplacer (et écraser) tous les fichiers d'un répertoire à un autre ?

Comment supprimer tous les conteneurs Docker

Comment puis-je changer tous les fichiers appartenant à un utilisateur à un autre utilisateur ?

Comment remplacer tout le contenu d'un dossier par un autre

Comment obtenir la n-ième ligne après une grep?