Sziasztok,
legyen egy túlnyomórészt ASCII karaktereket tartalmazó angol nyelvű fájl. Viszont véletlenül belekeveredik egy-két UTF-8-as karakter (pl. sima kötőjel helyett UTF-8-as gondolatjel, vagy sima aposztróf helyett UTF-8-as 9es alakú aposztróf)... a fájlt UTF-8as kódolással mentem el, tehát "cat file.txt" hatására úgy látszik, mintha csak ASCII karakterek lennének benne. A kérdésem az lenne, hogy hogyan lehetne megszűrni ezt a fájlt az UTF-8 karakterektől? Tehát valamilyen program vagy script, amely csak a "nem ASCII" karaktereket printelné ki a fájlból.
kösz.
- 3194 megtekintés
Hozzászólások
felir
- A hozzászóláshoz be kell jelentkezni
Valami ilyesmire gondoltal?
nyos@hex:~/src$ cat ./utfchars.c
#include <stdio.h>
int main()
{
int c;
while(EOF!=(c=getchar()))
if(c&0x80)
putchar(c);
return 0;
}
nyos@hex:~/src$ ./utfchars
árvíztűrő tükörfúrógép
áíűőüöúóé
szerk: egyebkent iconv tud transliterate modon konvertalni, szoval valamivel kozeliti amit nem tamogat a cel kodolasa
--
+++ Divide By Cucumber Error. Please Reinstall Universe And Reboot +++
- A hozzászóláshoz be kell jelentkezni
szuper, pontosan erre gondoltam.. először úgy gondoltam, hogy megyek sorba, és kitörlöm az összes ASCII karaktert, amelyek szerepelhetnek a fájlomban, valahogy így:
cat file.txt | tr -d 'a-zA-Z0-9' | tr -d '# @%' | tr -d '..........
aztán mindjárt el is vetettem, mert az jutott eszembe, hogy, mi van, ha az UTF-8 láncból szedek ki valamilyen karaktert.... tehát tévesen azt hittem, hogy csak az első bájtjára kell teljesülni, hogy > 0x7F.... szóval egy UTF-8 karakter minden bájtja a kiterjesztett kódtáblából kell, hogy legyen?
amúgy a Te megoldásod sokkal elegánsabb, és kifejezőbb, mint az enyém lett volna.. meghát gyorsabb is, mint "tr" programokat hívni....
- A hozzászóláshoz be kell jelentkezni
Azt azért elárulod, hogy miért nem egy db. tr-t hívsz - egy nagyobb paraméterrel -, hanem egy vagonnal hívogatsz egymás után?
- A hozzászóláshoz be kell jelentkezni
hát csak párszor már megjártam, amikor túl sok speciális karaktert pakoltam a "tr" proginak... tudom, hogy a kötőjelre meg a tetőjelre más szabályok vonatkoznak... vagy például aposztrófok között nem tudok aposztrófot megadni.... szóval igazad van, csak rossz szokásból...
- A hozzászóláshoz be kell jelentkezni
> szóval egy UTF-8 karakter minden bájtja a kiterjesztett kódtáblából kell, hogy legyen?
Igen. A tr-es megoldás amire gondoltál az jó.
- A hozzászóláshoz be kell jelentkezni
kösz a választ.. még az jutott az eszembe, hogy vannak ezek a karakterhalmazok, mint például:
[:alnum:], [:alpha:], [:lower:], [:print:]
ezek egyszerű kombinációjával nem lehetne valahogy olyan pattern-t létrehozni, amelyik illeszkedik az összes 0..127 karakterre?
- A hozzászóláshoz be kell jelentkezni
Ahány tr, annyi fajta viselkedés, de elvileg az lenne az igazán jó (nem tudom hogy így van-e), ha az alnum és társai bizony illeszkednének az UTF-8-as alfanumerikus cuccokra. Tehát te pont nem ezt akarod.
Szerk.: És ugyanemiatt az a-z típusú intervallumok is cinkesek, hiszen beüt a locale, amelyik átdefiniálja a sorrendet, például az a és b közé bejöhet az á. Szóval ha tutira akarsz menni, írd ki végig hogy abcdefgstb...
- A hozzászóláshoz be kell jelentkezni
kösz, értem, marad a C program
- A hozzászóláshoz be kell jelentkezni
"hiszen beüt a locale, amelyik átdefiniálja a sorrendet"
Érdekes, hogy ha a PS1 vagy a PATH értéke nem az igazi, mindenkinek trivi, hogy az adott helyzetben megfelelő értékre definiálja, de ez messze nincs így a LANG/LC_* változókkal, pedig ártani csak azok tudnak igazán.
- A hozzászóláshoz be kell jelentkezni
echo Árvíztűrő tükörfúrógép | perl -pe 's/[\000-\177]//g'
echo Árvíztűrő tükörfúrógép | perl -pe 'tr/\000-\177//d'
- A hozzászóláshoz be kell jelentkezni