Ékezetes grep

Fórumok

Sziasztok!
Tud valaki módszert arra, hogyan lehet fájlokban ékezetes szövegre keresni? Pl. grep-pel, vagy hasonlóval?
Köszi!

Hozzászólások

Úgy tudom hogy a grep 7 bites, az fgrep meg 8 bites.

ELaci

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 :- ) ).

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 :(

Í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.

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!

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/

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.

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ú.