[megoldva]sed ékezettelenítés, regexp furcsaság

Sziasztok!

Fájlnevekből szeretném kivenni az ékezeteket és mindent ami nem esik bele ebbe: A-Za-z0-9.
Illetve ami beleesik, azt kicserélni erre: _

Találtam itt a hup-on megfelelő ékezettelnítő scriptet, de az nekem kicsit kevés:
# echo $file| sed "y, űáéúőóüöíŰÁÉÚŐÓÜÖÍ,_uaeuoouoiUAEUOOUOI,"

Ugyanis a fájlnevekben ilyen karakter is előfordulhat: ▒
Ezzel próbálokzatam: echo $file | sed 's/[^A-Za-z0-9.]/_/g'

A fenti karakter azért fordulhat elő, mert az FTP szerver UTF-8-as, egyes kliensek (totalcommander) pedig nem a legfrissebb, és a felhasználót nem érdekli, hogy ékezet van a fájlnévben. (Ezt nem tudom meg lehet-e oldani szerverszinten.)

Az én scriptem a logika szerint mindent ki kéne csaréljen "_"-re, ami nem esik bele a A-Za-z0-9. tartományba.

Miért nem így tesz?

üdv: redman

Hozzászólások

mert a . bármilyen karakterre illeszkedik

Csatlakozom elottem levo kollegahoz

a . minden karakter
a pont a \. vagy bash eseten \\. illetve az ESCAPE char

Még talán annyi, hogy én valószínűleg iconv-vel oldanám meg:


$ touch 'árvíztűrő tükörfúrógép'
$ ls
árvíztűrő tükörfúrógép
$ ls -1 | while read fname; do
>   translit=`echo "$fname" | iconv -f UTF-8 -t US-ASCII//TRANSLIT`
>   mv "$fname" "$translit"
> done
$ ls
arvizturo tukorfurogep

Mondjuk ez feltételezi, hogy a fájlnevek karakterkódolása ismert és azonos.

Ezt próbáld ki:
echo $file | LC_ALL=C sed 's/[^A-Za-z0-9.]/_/g'

Szerintem az a bibi, hogy a sed mivel UTF-8 környezeti változókkal fut, ezért feltételezi az inputjáról hogy az valid UTF-8, márpedig nem az. Így viszont ASCII-t fog feltételezni. Ha ez sem megy (mert a 128 fölötti byte-okon kiakad), akkor LC_ALL=en_US.ISO8859-1 vagy valami ilyesmi...