将所有非ascii字符更改为ascii Bash Scripting

时间:2015-10-06 23:19:39

标签: linux bash shell ascii

我正在尝试编写一个脚本,将人名作为参数并创建一个包含其名称的文件夹。但在文件夹名称中,非ascii字符和空格有时会产生问题,因此我想删除或更改为ascii字符。 我可以删除姓名和姓氏之间的空格,但我无法弄清楚如何更改ş-&gt; s,ç-&gt; c,ğ-&gt; g,ı-&gt; i,ö-&gt; o。< / p>

这是我的代码:

#!/bin/bash

ARRAY=("$@")
ELEMENTS=${#ARRAY[@]}


for (( i=0;i<$ELEMENTS;i++)) 
do  #C-like for loop syntax
    echo ${ARRAY[$i]} | grep "[^ ]*\b" | tr -d ' '
done 

我按照myscript.sh'ÇişilAksoy''CemDalgıç'

运行我的剧本

它应该改变如下的论点:CisilAksoy CemDalgic

提前致谢

编辑:     我发现这个解决方案,这看起来不是很漂亮,但它的工作原理。

sed 's/ş/s/gI; s/ç/c/gI; s/ü/u/gI; s/ö/o/gI; s/ı/i/gI;'

EDIT2:已解决

#!/bin/bash

ARRAY=("$@")
ELEMENTS=${#ARRAY[@]}

for (( i=0;i<$ELEMENTS;i++)) 
do  #C-like for loop syntax
    v=$(echo ${ARRAY[$i]} | grep "[^ ]*\b" | tr -d ' ' | sed 's/ş/s/gI; s/ç/c/gI; s/ü/u/gI; s/ö/o/gI; s/ı/i/gI;')
    mkdir $v
done 

2 个答案:

答案 0 :(得分:2)

任何从UTF-8转换为ASCII的东西都将是妥协。

iconv程序会执行所请求的内容(不一定让所有人满意,例如 Transliterate any convertible utf8 char into ascii equivalent )。给定

 Çişil Aksoy' 'Cem Dalgıç

in&#34; foo.txt&#34;和命令

iconv -f UTF8 -t ASCII//TRANSLIT <foo.txt

会给出

Cisil Aksoy' 'Cem Dalg?c

lynx browser有一组不同的ASCII近似值。使用此命令

lynx -display_charset=us-ascii -force_html -nolist -dump foo.txt

我得到了这个结果:

C,isil Aksoy' 'Cem Dalgic,

答案 1 :(得分:1)

简单地说,你不能。 ASCII仅支持128个字符。 国际字符通常使用Unicode的某些变体,它可以存储更多数量的字符。

我认为您最好的选择是确定在使用这些字符时您的文件夹创建失败的原因。方法或函数不支持Unicode吗?如果是,请弄清楚如何指定而不是ASCII。如果没有,你可能会陷入sed和/或tr,这可能是不可持续的。

[增订]

能够通过tr替换多个字符,如下所示:

echo şğıö | tr şçğıö scgio
sgio

(我之前删除了我的评论。我在不同的服务器上试过它并且运行正常。)