Substituir o umlauts por expressões regulares

1

Eu gostaria de sincronizar várias pastas no meu Mac local com um servidor remoto via SFTP. Como os trema existentes parecem ser problemáticos para meu software de sincronização (Deltawalker), estou procurando uma maneira de identificar os nomes de arquivos de qualquer caractere problemático.

Existem vários programas (atualmente estou experimentando o PowerRenamer, mas há vários para substituir caracteres com base em expressões regulares, mas não consigo descobrir que tipo de RegExp eu preciso usar. Substituir ocorrências únicas é fácil, mas ter uma lista de transliterações (ou seja, ä / ae, ü / ue, ß / ss, / a, etc.) parece estar além das minhas habilidades.

Existe algo que eu possa usar como um RegExp? O software usa a estrutura RegexKit .

Obrigado Helge.

    
por Cantello 21.11.2011 / 12:48

3 respostas

1

Duas maneiras de remover caracteres com diacríticos em um script de shell:

chars="äéėèêß○‡€"

echo -n "$chars" | iconv -c -f utf-8 -t us-ascii//TRANSLIT | tr -d "\"\'^'"
#=> aeeeessEUR

echo -n "$chars" | sed 's|ä|ae|g;s|ß|ss|g' | tr -C '
touch ~/Desktop/test\ {ää,öö}.txt
find ~/Desktop/ -maxdepth 1 -iname "test*" |
while read f; do
    mv "$f" "$(tr -C '
chars="äéėèêß○‡€"

echo -n "$chars" | iconv -c -f utf-8 -t us-ascii//TRANSLIT | tr -d "\"\'^'"
#=> aeeeessEUR

echo -n "$chars" | sed 's|ä|ae|g;s|ß|ss|g' | tr -C '
touch ~/Desktop/test\ {ää,öö}.txt
find ~/Desktop/ -maxdepth 1 -iname "test*" |
while read f; do
    mv "$f" "$(tr -C '%pre%0-0' '_' <<< "$f")"
done
0-0' '_' #=> ae____ss___
0-0' '_' <<< "$f")" done
0-0' '_' #=> ae____ss___

Renomear em lote os arquivos depois de encontrá-los recursivamente:

%pre%     
por 21.11.2011 / 19:10
0

Já existe uma saída na sua situação: use várias "rodadas" de renomeação para cada personagem.

De qualquer forma, um único padrão de regex clássico é apenas um único caso. Você precisará de construções mais expressivas na sua linguagem de programação de renomeação para expressar o que você quer além de apenas um padrão de regex e substituição.

Por exemplo, sed (um editor de fluxo padrão do Unix) permite colocar vários " substituir "comandos ( s ) em um programa (assim: s/a/AA/g;s/b/BB/g ); eles seriam aplicados sequencialmente a cada linha de entrada. Um usuário Unix com algumas habilidades de script / shell poderia combinar sed com comandos de renomeação de arquivos para obter o que você deseja. Você está disposto a aprender algum shell Unix?

    
por 21.11.2011 / 13:06
0

Um utilitário / script elegante para renomear a massa na linha de comando é o utilitário de renomeação perl (consulte CPAN - link é de Larry Wall).

Meu uso não tão elegante desta ferramenta para renomear a subárvore inteira do diretório atual (todos os tremas alemães em codificações diferentes (também quebradas em UTF-8) para ASCII) é:

encontrar ./ -print0 | xargs -0 -L1 -I {} renomear -n / s / ä / ae / g / s / ö / g / s / ü / ue / g / s / Ö / Oe / g / s / Ü / Ue / g / s / Æ / g / s / ß / sz / g / s / \ x75 \ xcc \ x88 / ue / g; s / \ x61 \ xcc \ x88 / ae / g; s / \ x6f \ xcc \ x88 / oe / g; ' "{}"

Isto imprime o que está feito. Remova o -n para obter a coisa real.

    
por 20.02.2012 / 14:26