Sziasztok!
Tud valaki módszert arra, hogyan lehet fájlokban ékezetes szövegre keresni? Pl. grep-pel, vagy hasonlóval?
Köszi!
- 1766 megtekintés
Hozzászólások
Úgy tudom hogy a grep 7 bites, az fgrep meg 8 bites.
ELaci
- A hozzászóláshoz be kell jelentkezni
Én most kipróbáltam, az én grepem keres ékezetet is, version: grep (GNU grep) 2.5.1, viszont ha már itt tartunk ugyanez a kérdés UTF8- ra hogyan működik?
- A hozzászóláshoz be kell jelentkezni
perl, anyone?
- A hozzászóláshoz be kell jelentkezni
És hogy írod be neki az ékezetes betűket?
A fájl, amiben keresni akarok, nem UTF-8, a vi rendesen megmutatja az ékezetek többségét. Ha megadom azt a grep-nek, amit a vi lát, akkor sem megy. (Az enyém is grep (GNU grep) 2.5.1)
- A hozzászóláshoz be kell jelentkezni
Hi!
Simán így:
cat file | grep -i ő
, de lehet, hogy Nálad terminálbeállítások miatt nem megy. Én ezt egy sima xterm alatt próbáltam ki, s ha megmondod milyen beállítások az érdekes, akkor elküldöm Neked az enyéimet, csak mert fogalmam sincs róla, hogy mi kell ehhez.
Az világos, hogy nem UTF-8, csak gondoltam megkérdezem, hogy egy UTF-8- as fájlhoz nincs valami grep (mondjuk greputf8 :- ) ).
- A hozzászóláshoz be kell jelentkezni
Nekem hol megy hol nem...
adott egy LaTeX által generált kód, ami mondjuk egy indexfájl.
abból készítek magamnak egyedi tárgy- név- és irodalomjegyzéket, lépten-nyomon elakadok, de szerencsére a 2/3 része megvan már a kódnak.
tehát a lényeg:
Zénón nevére keresek rá a szövegben pl. így:
cat eposz.idx | grep -i Zénón
cat eposz.idx | grep -i 'Zénón'
..vagy ugyanez "-mel --- és nem találja meg.
viszont ha rákeresek csupán az összes ó betűs sorra, kidobja nekem a Zénón-t tartalmazó sort is.
mit ronthatok el?
kódolás mindenütt utf8.
pusztítsam át az egész állományt sed-del így:
é --> \'e
ó --> \'o
? és aztán már megy a grep?
biztos van valami cool megoldás..
Nem szakdolgozathoz kell, nem a beadandómat csinálom, nem kereskedelmi célt szolgálok, csak könyörületes segítséget kérek..
köszönet
UI:
az abszolút részlet a scriptjeim egyikéből így fest:
#!/bin/sh
nev=`echo $1 | sed "s/===/ /g"` #itt a beépített === sort likvidálom...
echo $nev # név kiírása ellenőrzésképpen
cat nevmutato.temp | grep -i $nev
exit 0
az a fájl, amiben keresek, az meg (csak a megfelelő részletet véve) így fest:
"
Wynn, Karen 88
Zangwill, Oliver 87
Zipf 23
Zénón 110
"
...és Zénón nem létezik :(
- A hozzászóláshoz be kell jelentkezni
Így 10 hónap távlatából nálam ez úgy megy, hogy mindenhol csak és kizárólag normál xtermet használok. Na most ha valami hasonlóra van szükségem, akkort ctrl + jobb katt az xtermben, alul UTF8 kiválaszt, és megy a grep mindenre, ha meg kész, akkor utána utf8 megszüntet, eredeti kódolás visszaállít, de ha Neked mindenhol (file, terminál) UTF8- ad van, akkor val. ez nem fog segíteni... . Viszont olvasd el, amit egmont írt lejjebb, azzal többre mész szvsz.
- A hozzászóláshoz be kell jelentkezni
Küldd már el légyszi az xterm-ed beállításait (XTerm nevű fájl a home-odban vagy a valami/app-defaults alatt, illetve parancssori opciók). Nekem még sehogyan sem sikerült rávenni az xterm-et, hogy futás közben váltson utf8 és nem utf8 között; kíváncsi lennék hogy egy hogyan működik. Milyen disztribet használsz? Ha lehet, az egmont kukac uhulinux pont hu címre kérném szépen ezt a fájlt. Előre is köszi!
- A hozzászóláshoz be kell jelentkezni
Elküldtem... .
- A hozzászóláshoz be kell jelentkezni
Első megközelítés (ez nem az igazság, csak didaktikailag felépítem mondandómat):
A grep nem törődik a karakterkészlettel, nem érdekli őt. Arra a bytesorozatra keres rá, amit a parancssorban megadsz. Ha a parancssorban utf8-ban beírsz egy ő betűt, akkor az (anélkül hogy a grep bármit is tudna az utf8-ról) pontosan a fájlbeli utf8-as ő betűkre fog illeszkedni. (Az utf8-nak van egy olyan jó tulajdonsága, hogy nem tud egyik betű illeszkedni másikra, például kizárt hogy egy kínai szimbólum 3 byte-jának egyik részeként az ő betű 2 byte-ja megjelenjen.)
Azt megcsinálni, hogy parancssorban latin2-ben beírsz egy ő betűt, és ez illeszkedjen a fájlban utf8-ban kódolt ő betűre, vagy épp fordítva, nem könnyű, a grep-től függetlenül kell iconv-val vagy recode-dal valahogy elvégezni a karakterkészlet-konverziót valami közösre. Ilyet tehát a grep magától nem tud.
Második megközelítés:
Az első megközelítés elején hülyeséget írtam, ezt most tisztába kell tenni. A grep-nek nagyon sok esetben igenis kell tudnia a karakterkészletet. Ezen múlik például a "-i" (ignore case) viselkedése, ezen múlik a "." (egy darab tetszőleges karakter, ami lehet több byte is akár) értelmezése és így tovább. Ezt az információt természetesen a megfelelő locale környezeti változókból szedi.
Az továbbra is változatlanul igaz, hogy a grep önmagában nem képes másmilyen kódolású parancssori argumentumot és fájlt összevetni, mind a parancssori argumentumot, mind a fájlt a locale beállítások szerinti kódolásúnak feltételezi. Tehát egy legsimább (case-sensitive) fgrep esetén szinte tök mindegy, mi a locale, mert bytesorozat-egyeztetést csinál, és ha a fájlban és a parancssorban azonos kódolású ő betűt adsz meg, az egyezni fog mint bytesorozat, ami akár latin2-ben, akár utf8-ban azt jelenti, hogy egyeznek mint betűk. Ugyanakkor picivel bonyolultabb szituációkban már a grepnek is jól tudnia kell, hogy mi az a bizonyos karakterkészlet, amivel dolgozik.
A hivatalos grep 2.5.1 jól kezeli az utf8-at, ha ilyen környezeti változókkal fut, nem kell tehát külön program. Ugyanakkor szánalmasan lassú utf8-as kódolással. Ha normális (értsd: villámgyors) tempót akarsz, a Fedora Core 5-ös (vagy UHU dev ág) grep csomagjának patcheit alkalmazd, ezek tartalmaznak mindenféle gyorsítást és apró javítást kifejezetten az utf8-ra.
http://download.fedora.redhat.com/pub/fedora/linux/core/5/source/SRPMS/…
https://svn.uhulinux.hu/packages/dev/grep/patches/
- A hozzászóláshoz be kell jelentkezni
Ilyen esetben én mindig átállítom a Konsole kódolását (Beállítások -> Kódolás).
De vigyázz, mert UTF-8-ra van optimalizálva, és ha nem két bájtot adsz meg neki latin2-vel, ami UTF-ben az (pl. é vagy ő), akkor még egy karaktert le kell írnod, majd törölnöd, hogy megjelenjen.
- A hozzászóláshoz be kell jelentkezni
Ha már előjött az a régi topik ...
Köszi a tippeket, időközben valahogy megoldódott. Mivel a grep csomag az FC5-ben azóta nem frissült, valószínűleg az történhetett, hogy amit gnome-terninal-ban begépelek a grep parancs mellé, az már normális UTF-8 kódolású.
- A hozzászóláshoz be kell jelentkezni