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