regexp segitseg kellene

Sziasztok!

Az allabbi regexp-et hogyan tudom kiboviteni ugy, hogy a [ ne cserelje je, hanem hagyja meg. (A felsorolt karaktereken kivul az osszeset ki akarom gyomlalni _-ra)

s/[^[:alnum:]\[().-]/_/g

pelada:(ahogy jelenleg mukkodik)
Errol: teszt/ez jo file -()[].file
Erre: teszt/ez_jo_file_-()[_.file

Hozzászólások

Akor meg is valaszolom magamnak :)
s/[^][:alnum:]\[().-]/_/g

Errol: teszt/ez jo file -()[].file
Erre: teszt/ez_jo_file_-()[].file

Azaz, nem mindenhol mukodik rendesen.
s/[^]qwertzuiopasdfghjklyxcvbnmQWERTZUIOPASDFGHJKLYXCVBNM123456789\[().-]/_/g

gep1 /lenny locale en_us.utf8
Errol: teszt/cs sc zs sz rs sr
Erre: teszt/cs_sc_zs_sz_rs_sr

gep2 /etch locale hu_hu.utf8
Errol: teszt/cs sc zs sz rs sr
Erre: teszt/_sc_rs_sr

Termeszetesen, a gep1 adja a jo eredmeny, u.a. a script mert ad ki mas eredmenyt?

Szerk: gep2 atalitva a locales-t en_us-utf8-ra akkor jo lessz.

Nem régen volt hasonló problémám. Én azzal zártam rövidre, hogy a bash változó-helyettesítést használtam:
echo ${a//[^]q...89\[().-]/_}

Ez mindenféle locale-beállítással és ékezetes betűkkel is működik - viszont gondolom karakter-osztályokat nem használhatsz, mert ez nem regexp, csak messziről néz ki úgy.

szaszi

Megtennéd, hogy leírod konkrétan, hogy mi a franccal is akarod ezt a cserét végrehajtani? Ugyanis szerintem nem egyértelmű, hogy a bash ${valtozo//errol/erre/} formáját akarod használni (ekkor fontos, hogy bash alatt dolgozol, viszont akkor nem kell "s" a csere elejére, és nem kell "g" a végére); vagy pl. sed-ben akarsz ilyen cserét, ekkor meg - ha aposztrófok közé zárod az egész vackot - tök mindegy, hogy bash-t használsz, vagy akármilyen más shell-t. Az általad adott szintaxisból én amúgy a másodikra (sed) tippelnék, de jó lenne tisztázni.

Amúgy pedig: szögletes zárójelen belül ( [ ) speciális jelentéssel bír a kötőjel és a záró zárójel, de nem így a hanyatt-törtvonal. Szóval ha esetleg odafigyelve begépelnéd, hogy mit is akarsz mire cseréni (mondjuk (code) (/code) blokkon belül).
Ez nem az amit akarsz?


[zgabor@Picasso ~/Desktop]$ echo $a
teszt/ez jo file -()[].file
[zgabor@Picasso ~/Desktop]$ echo $a|sed -e 's/[^][().[:alnum:]-]/_/g'
teszt_ez_jo_file_-()[].file
[zgabor@Picasso ~/Desktop]$ 

Sed-del probaltam vegrehajtani, filenevbol szeretnem kigyomlalni, a nem oda valo karaktereket. A vegrehajtando cserek egy file-ban vannak (replace.sed)


s/Á/A/g
s/É/E/g
s/Í/I/g
s/Ó/O/g
s/Ö/O/g
s/Õ/O/g
s/Ő/O/g
s/Ú/U/g
s/Ü/U/g
s/Û/U/g
s/Ű/U/g
s/á/a/g
s/é/e/g
s/í/i/g
s/ó/o/g
s/ö/o/g
s/õ/o/g
s/ő/o/g
s/ú/u/g
s/ü/u/g
s/û/u/g
s/ű/u/g
s/\\/_/g
s/[^][().qwertzuiopasdfghjklyxcvbnmQWERTZUIOPASDFGHJKLYXCVBNM0123456789-]/_/g

Bash változo cserevel mukodik is szaszi megoldasa alapjan, de engem az eredeti problema is erdekel, hogy sed-del hogyan lehet.
[:alnum:] az a problema, hogy jonehany nem oda valo karaktert is meghagy, ezzel kezdtem, ezutan tertem at a felsorolasra, bar ez a kettosbetuket meghadgya.
Pl.


Errol:    teszt/$ß&ŁßŁ@þ``aa.txt
Erre:     teszt/_ß_ŁßŁ_þ__aa.txt
Ahitott:  teszt/__________aa.txt

Jelenleg az a problema, hogyha a localas hu_hu.utf8 akkor kigyomlalja a kettos betuket.
Pl.


Errol: teszt/cs sc zs sz rs sr
Erre:  te_t/_sc_rs_sr

en_us locale eseten meg jo.


Errol: teszt/cs sc zs sz rs sr
Erre:  teszt/cs_sc_zs_sz_rs_sr

A script ide vonatkozo resze:


function new_name {
  local newfilename=$(echo "$1" | sed -f replace.sed)
#   | tr -s "_"
  case $charcase in
    l) echo $newfilename | tr [:upper:] [:lower:] ;;
    u) echo $newfilename | tr [:lower:] [:upper:] ;;
    *) echo $newfilename ;;
  esac
}

Szaszi problémájára már az ő szálában válaszoltam: ha a hu_hu.UTF-8 esetén nektek cserél a sed (perl, akármi), akkor javítsátok ki a locale definíciót.

És fenntartom, hogy amit korábban írtam annak működnie kéne. Ha jól értem, minden ékezetes betűt lecserélsz az ékezettelen párjára, és egyébként pedig a betűket, számokat, a - , a () és a [] karaktereket akarod megtartani. Tehát kell a cserélő rész elejére az s/á/a/g (és í. t.) sorozat, a végére pedig ez:


s/[^][()[:alnum:]-]/_/g

Ha nem OK, akkor adj olyan példát, amire ez nem jó (esetleg oprendszer és sed verziót is), hátha úgy valakinek könnyebb tesztelni.
Vagy meg kellene nézni, hogy az alnum vajon mi a francot tartalmaz a betűn és számon kívül (és miért).

Pl. erre nem jo az [:alnum:] :)


Errol:    teszt/$ß&ŁßŁ@þ``aa.txt
Erre:     teszt/_ß_ŁßŁ_þ__aa.txt

A rendszer debian etch up-to date, gyari csomagokbol.

De most a benti gepemen (debian lenny) atalitottam a hu_hu.UTF-8, es elojott a problema. (sed --version GNU sed version 4.1.5)

A problema, a kettos betukel van. az "sz" nem ilesszkedik a [s....z] (egyenkent felsorolva) ha [a-z] formaban adom meg, akkor a cs, sz mar beletartozik, de a zs mar nem, es megmardnak az angol abc-n kivuli karakterekbol is.

Megoldasnak ezt gondoltam:
"[.coll.] Matches the specified collation element, which may be one or more characters. May only be used within a matching list. For example, the expression [[.ch.]] matches the Spanish letter "ch". Table A-4 lists the valid collation elements."
De sajnos nem mukodik
a [.sz.] ezt mondja: Invalid collation character


Errol:        Cs, Dz, Dzs, Gy, Ly, Ny, Sz, Ty, Zs
Erre
(alnum):      Cs__Dz__Dzs__Gy__Ly__Ny__Sz__Ty__Zs
felsorolas:   _________________________

"akkor javítsátok ki a locale definíciót" Ez nekem elegge szogelesnek tunik.

Jo reggelt, kave elott, vagy utan :)
A magyar karaktereket is tuzzel-vassal irtom a file nevekbol, nem szeretnem ezokat megtartani, csupan ekezetleniteni. A tr meg nem hajlando megcsinálni. (tr "éá" "ea")
En mondom mindenkinek, az ekezetes file-nevekkel mindig csak a gond van :D, most is csak itt sz* vele.