使用正则表达式替换变音符号

使用正则表达式替换变音符号

我想通过 SFTP 将本地 Mac 上的多个文件夹与远程服务器同步。由于现有的变音符号似乎对我的同步软件 (Deltawalker) 有问题,我正在寻找一种方法来消除文件名中所有有问题的字符。

有几种程序(我目前正在尝试 PowerRenamer,但有几种可以根据正则表达式替换字符,但我似乎无法弄清楚我需要使用哪种 RegExp。替换单个出现的内容很容易,但有一个音译列表(即 ä/ae、ü/ue、ß/ss、â/a 等)似乎超出了我的技能。

有什么可以用作正则表达式吗?该软件使用RegexKit 框架

谢谢,Helge。

答案1

有两种方法可以删除 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 '\000-\200' '_'
#=> ae____ss___

递归找到文件后批量重命名文件:

touch ~/Desktop/test\ {ää,öö}.txt
find ~/Desktop/ -maxdepth 1 -iname "test*" |
while read f; do
    mv "$f" "$(tr -C '\000-\200' '_' <<< "$f")"
done

答案2

针对您的情况已经有解决办法:对每个角色进行多“轮”重命名。

无论如何,单个经典正则表达式模式只是一种情况。您需要在重命名编程语言中使用更具表现力的构造来表达您想要的内容,而不仅仅是正则表达式模式和替换。

例如,sed(标准 Unix 流编辑器)允许将多个“替代”命令(s)放入一个程序中(如下所示s/a/AA/g;s/b/BB/g:);它们将按顺序应用于每一行输入。具有一些脚本/shell 技能的 Unix 用户可以组合sed使用文件重命名命令来实现你想要的。你愿意学习一些Unix shell吗?

答案3

一个优雅的实用程序/脚本,用于在命令行上批量重命名,即 perl rename 实用程序(请参阅 CPAN -http://search.cpan.org/~rmbarker/File-Rename-0.06/rename.PL这是拉里·沃尔的作品。

我不太优雅地使用此工具来重命名当前目录的整个子树(所有德语变音符号以不同的(也是损坏的 UTF-8)编码为 ASCII):

查找 ./ -print0 | xargs -0 -L1 -I{} 重命名 -n 's/ä/ae/g;s/ö/oe/g;s/ü/ue/g;s/Ö/Oe/g;s/Ü/Ue/g;s/Ä/Ae/g;s/ß/sz/g;s/\x75\xcc\x88/ue/g;s/\x61\xcc\x88/ae/g;s/\x6f\xcc\x88/oe/g;' "{}"

这将打印出所完成的操作。删除 -n 以获取实际内容。

相关内容