GNU/Linux >> Znalost Linux >  >> Linux

Jak nahradit všechny středníky za 1.?

Tento problém souvisí s mým pokusem importovat otázky a jejich odpovědi v souboru Excel do souboru .txt, který program Anki flashcard zpracovává, jak je popsáno zde.
Nemohu mít více než 2 pole, takže potřebuji nastavit možnosti jako jedno pole .

Data uložená jako CSV z LibreOffice (středník jako oddělovač polí – pouze rozdíl mezi tím, co říká příručka) podle pokynů v příručce 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
...

kde každý záznam se všemi možnostmi je na jednom řádku, tj. jedna „flashcard“. Na jedné kartě přední část před středníkem a zadní část za středníkem. Druhá kartička na novém řádku a tak dále.

Požadovaný výstup, který by měl být v 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
...

Můj pseudokód v Perlu na základě této odpovědi

perl -00 -pe s/;/\0/; s/;/ |/g; s/\0/;/' file

Komentováno

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

Jak můžete nahradit všechny středníky za 1. středníkem?

Přijatá odpověď:

sed 'y/|;/\n|/;s/|/;/;y/\n/|/' <<\IN
Question ipsun; option 1 ; option 2 ; option 3 ; option 4 ; ... ; option n
IN

Všimněte si, že to není použijte regulární výraz ke zpracování většiny náhrad, ale spíše používá základnější (a mnohem výkonnější) překlad funkce k tomu – a činí tak přenosným způsobem POSIX. To by mělo fungovat na každém počítači s POSIX sed nainstalováno.

Překládá ; středníky na | potrubí a | potrubí do \n ewlines současně. | roury jsou vyčleněny jako \n ewlines v případě, že se nějaké objeví na vstupním řádku. Poté s/// nahrazuje první vyskytující se | potrubí pro ; středník a poté přeloží všechny \n ewlines do | roury – tedy obnoví vše, co mohlo mít odložené, aby bylo možné robustně zvládnout jediný s/// substituce.

Zatímco já používám <<\IN zde-document kvůli ukázce kopírování/vkládání byste pravděpodobně měli použít <infile >outfile .

VÝSTUP:

Question ipsun; option 1 | option 2 | option 3 | option 4 | ... | option n

Linux
  1. Jak odebrat všechny soubory ve složce kromě jednoho konkrétního souboru v systému Linux

  2. Jak nahradit řetězec v souboru (souborech)?

  3. Jak přesunout všechny soubory (včetně skrytých) z jednoho adresáře do druhého?

  1. Jak integrovat příkaz MV po příkazu Najít?

  2. Jak vypsat všechny přihlášené uživatele

  3. Jak nahradit všechny výskyty slova ve všech souborech v příkazovém řádku Linuxu

  1. Jak odstranit všechny kontejnery Docker

  2. Jak nahradit více mezer jedním tabulátorem

  3. Jak mohu změnit všechny soubory patřící jednomu uživateli na jiného uživatele?