有没有办法从 Tcl 中的字符串中删除重音符和变音符?
Is there any way to remove accents and cedillas from string in Tcl?
在 CLi 终端上,使用 bourn shell 可以:
# Remove characters with accents
for n in *
do
sudo mv "$n" "`echo $n | sed 'y/áÁàÀãÃâÂéÉêÊíÍóÓõÕôÔúÚüÜçÇ/aAaAaAaAeEeEiIoOoOoOuUuUcC/'`"
done
# sed - Removing accented characters
sed 'y/áÁàÀãÃâÂéÉêÊíÍóÓõÕôÔúÚüÜçÇ/aAaAaAaAeEeEiIoOoOoOuUuUcC/'
find . -maxdepth 1 -iname "*" | grep -E '[áÁàÀãÃâÂéÉêÊíÍóÓõÕôÔúÚçÇ]' | sed 'y/áÁàÀãÃâÂéÉêÊíÍóÓõÕôÔúÚüÜçÇ/aAaAaAaAeEeEiIoOoOoOuUuUcC/'
但是对于 Tcl,特别是 tclsh,如果没有类似 Unix 的命令,我怎么能表现出与上面相同的效果。有作为吗???
特别是我首先想知道我们如何从变量中更改奇怪的字符,如下所示:
# This sentence is in Brazilian Portuguese
set text "Tcl e sh são muito sensíveis ao espaço em branco."
如果有人想在 tclsh 中引入其他方法来替换文件名中的重音符号和变音符。这对于这个问题也有效,因为我需要了解您是否可以在纯 Tcl 中执行此操作。
与 string map :
set text "Tcl e sh são muito sensíveis ao espaço em branco."
set newtext [string map -nocase {ã a ç c í i} $text] ; # non-exhaustive list
# Tcl e sh sao muito sensiveis ao espaco em branco.
一个很好的方法是借助 tcllib 中的 unicode
normalization package。关键是有规范化形式 D(分解),所有字符都变成简单的 ASCII(如果适用)和单独的组合重音。
package require unicode
set text "Tcl e sh são muito sensíveis ao espaço em branco."
set s [unicode::normalizeS D $text]
# trim out the composing chars (well, non-ascii because I'm lazy)
set trimmed [regsub -all {[^\u0000-\u00ff]} $s {}]
puts "Before: $text"
puts "After: $trimmed"
产生此输出:
Before: Tcl e sh são muito sensíveis ao espaço em branco.
After: Tcl e sh sao muito sensiveis ao espaco em branco.
如果您必须处理真正的非拉丁文本(例如,阿拉伯语或韩语),那么您需要一个更窄的过滤器来删除组成字符。我只是懒得去查找我是 Unicode 的组合重音范围。
在 CLi 终端上,使用 bourn shell 可以:
# Remove characters with accents
for n in *
do
sudo mv "$n" "`echo $n | sed 'y/áÁàÀãÃâÂéÉêÊíÍóÓõÕôÔúÚüÜçÇ/aAaAaAaAeEeEiIoOoOoOuUuUcC/'`"
done
# sed - Removing accented characters
sed 'y/áÁàÀãÃâÂéÉêÊíÍóÓõÕôÔúÚüÜçÇ/aAaAaAaAeEeEiIoOoOoOuUuUcC/'
find . -maxdepth 1 -iname "*" | grep -E '[áÁàÀãÃâÂéÉêÊíÍóÓõÕôÔúÚçÇ]' | sed 'y/áÁàÀãÃâÂéÉêÊíÍóÓõÕôÔúÚüÜçÇ/aAaAaAaAeEeEiIoOoOoOuUuUcC/'
但是对于 Tcl,特别是 tclsh,如果没有类似 Unix 的命令,我怎么能表现出与上面相同的效果。有作为吗???
特别是我首先想知道我们如何从变量中更改奇怪的字符,如下所示:
# This sentence is in Brazilian Portuguese
set text "Tcl e sh são muito sensíveis ao espaço em branco."
如果有人想在 tclsh 中引入其他方法来替换文件名中的重音符号和变音符。这对于这个问题也有效,因为我需要了解您是否可以在纯 Tcl 中执行此操作。
与 string map :
set text "Tcl e sh são muito sensíveis ao espaço em branco."
set newtext [string map -nocase {ã a ç c í i} $text] ; # non-exhaustive list
# Tcl e sh sao muito sensiveis ao espaco em branco.
一个很好的方法是借助 tcllib 中的 unicode
normalization package。关键是有规范化形式 D(分解),所有字符都变成简单的 ASCII(如果适用)和单独的组合重音。
package require unicode
set text "Tcl e sh são muito sensíveis ao espaço em branco."
set s [unicode::normalizeS D $text]
# trim out the composing chars (well, non-ascii because I'm lazy)
set trimmed [regsub -all {[^\u0000-\u00ff]} $s {}]
puts "Before: $text"
puts "After: $trimmed"
产生此输出:
Before: Tcl e sh são muito sensíveis ao espaço em branco. After: Tcl e sh sao muito sensiveis ao espaco em branco.
如果您必须处理真正的非拉丁文本(例如,阿拉伯语或韩语),那么您需要一个更窄的过滤器来删除组成字符。我只是懒得去查找我是 Unicode 的组合重音范围。