Portál AbcLinuxu, 18. dubna 2024 13:36


Dotaz: Nahrazení textu ve více souborech (UTF-16) pomocí SEDu

Honza Balák avatar 29.3.2010 16:49 Honza Balák | skóre: 23 | blog: Jaxův linuxový zápisník | Předklášteří
Nahrazení textu ve více souborech (UTF-16) pomocí SEDu
Přečteno: 220×
Odpovědět | Admin
Příloha:
Zdravím, mám tu několik souborů v kódování UTF-16 BE a potřebuju v nich nahrazovat části textu. Myslel jsem, že to půjde lehce, ale nejde :-(. sed -e 's/CD_Beer2 cd_Bee/cd_Bee cd_Bee/g' *con totiž neprovede nic. Ukázkový soubor je v příloze. Kde dělám chybu? Díky...
<null>

Řešení dotazu:


Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

29.3.2010 17:09 Aleš Kapica | skóre: 51 | blog: kenyho_stesky | Ostrava
Rozbalit Rozbalit vše Re: Nahrazení textu ve více souborech (UTF-16) pomocí SEDu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Použij rouru..
29.3.2010 17:16 Aleš Kapica | skóre: 51 | blog: kenyho_stesky | Ostrava
Rozbalit Rozbalit vše Re: Nahrazení textu ve více souborech (UTF-16) pomocí SEDu
Asi takhle...
cat vstup.con | iconv -f UTF16LE -t UTF8 | sed 's/CD_Beer2 cd_Bee/cd_Bee cd_Bee/g' | iconv -f UTF8 -t UTF16LE > vystup.con
Honza Balák avatar 29.3.2010 17:19 Honza Balák | skóre: 23 | blog: Jaxův linuxový zápisník | Předklášteří
Rozbalit Rozbalit vše Re: Nahrazení textu ve více souborech (UTF-16) pomocí SEDu
Ale tohle mi nebude fungovat na více souborech...
<null>
29.3.2010 17:25 Vojtěch Horký | skóre: 39 | blog: Vojtův zápisník | Praha
Rozbalit Rozbalit vše Re: Nahrazení textu ve více souborech (UTF-16) pomocí SEDu
for f in soubor1 soubor2 ...; do
    iconv -f UTF16LE -t UTF8 <$f \
    | sed 's/CD_Beer2 cd_Bee/cd_Bee cd_Bee/g' \
    | iconv -f UTF8 -t UTF16LE \
    > tmp;
    mv tmp "$f";
done
Nebo je problém jinde?
I am always ready to learn although I do not always like to be taught. (W. Churchill)
Honza Balák avatar 29.3.2010 17:31 Honza Balák | skóre: 23 | blog: Jaxův linuxový zápisník | Předklášteří
Rozbalit Rozbalit vše Re: Nahrazení textu ve více souborech (UTF-16) pomocí SEDu
Tohle už by mohlo fungovat. díky
<null>
29.3.2010 17:27 Aleš Kapica | skóre: 51 | blog: kenyho_stesky | Ostrava
Rozbalit Rozbalit vše Re: Nahrazení textu ve více souborech (UTF-16) pomocí SEDu
Použij třeba find..

Do háje člověče seznam se prosím krapet se základními unixovými utilitami a příkazy. Tohle jsou věci které se používají už mraky let. Tahle věc má desítky řešení. Můžeš si to udělat jako alias, napsat jako skript kterým pak budeš prohánět ty soubory. A já nevím co ještě..
Řešení 1× (Honza Balák (tazatel))
29.3.2010 17:18 podlesh | skóre: 38 | Freiburg im Breisgau
Rozbalit Rozbalit vše Re: Nahrazení textu ve více souborech (UTF-16) pomocí SEDu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Těch chyb je více:
  1. sed, stejně jako všechny ostatní unixové utility, nedokáže s UTF16 nijak speciálně pracovat - předpokládá že jeden znak je jeden byte
  2. Při normálním spuštění sed ze souboru jen čte a výsledek jen vypíše na standardní výstup (tj. soubor se nemění). Aby změny zapsal do každého jednotlivého souboru, je nutné uvést přepínač -i
To druhé je celkem detail, ale to první bude docela problém - jedině provést konverzi do UTF-8 a pak zase nazpět. Pozor na BOM, aby se zachoval. Do implementace se mi momentálně nechce, navíc bude problém zda je k dispozici recode nebo iconv. A nebo python.

Alternativní "řešení":
sed -i 's/C\x00D\x00_\x00B\x00e\x00e\x00r\x002\x00 \x00c\x00d\x00_\x00B\x00e\x00e\x00/c\x00d\x00_\x00B\x00e\x00e\x00 \x00c\x00d\x00_\x00B\x00e\x00e\x00/g' *con
Vyzkoušeno, funguje, ale je to hnus :-)
Honza Balák avatar 29.3.2010 17:23 Honza Balák | skóre: 23 | blog: Jaxův linuxový zápisník | Předklášteří
Rozbalit Rozbalit vše Re: Nahrazení textu ve více souborech (UTF-16) pomocí SEDu
Tak hnus to je, ale jelikož to budu mít jako skript, tak by to nevadilo.
<null>

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.