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
- 2014 megtekintés
Hozzászólások
Akor meg is valaszolom magamnak :)
s/[^][:alnum:]\[().-]/_/g
Errol: teszt/ez jo file -()[].file
Erre: teszt/ez_jo_file_-()[].file
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
talán mert a locales hu_hu máshogy értelmezi a magyar betűket, (cs, zs, és tsai), legjobb emlékeim szerint ezeket a betűket bele kell írni a scriptbe külön.
- A hozzászóláshoz be kell jelentkezni
Egy kis segitseget tudsz adni, hogy hogyan?
\w-re gondolok, jo fele jarok? Csak hogyan kell beilleszteni :)
Szerk:
Na ugy nezem ennek kellene lennie s/[^][.ny.]qwe...... de erre ezt a hibauzit kapom "Invalid collation character".
[.coll.]
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
Koszi ez mukodik, de tanulas celjabol erdekelne, hogy regexp -el hogyan lehet ezt megoldani, ha meglehet. Fentebb irtam talaltam ra "megoldast" csak az nem mukodik :(.
- A hozzászóláshoz be kell jelentkezni
A perl kontra locale problémával van gondod, ami elég kemény harc.
Talán a man perllocale segít.
- A hozzászóláshoz be kell jelentkezni
shell #!/bin/bash a kuzdoter.
- A hozzászóláshoz be kell jelentkezni
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]$
- A hozzászóláshoz be kell jelentkezni
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
}
- A hozzászóláshoz be kell jelentkezni
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).
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
ékezetes betűket nem egyszerűbb beleírni a sedbe, mint külön fileban tárolni esetle?
Pl : [a-zA-ZáéíöüóőúűÁÉÖÜÓŐÚŰ \.]
szintaktikailag nem ziher hogy jó, mert most kelltem :DD, de a lényeg hogy írd bele a felsorolásba simán a magyar betűket is.
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni