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



我正试图写一个脚本,以人名作为参数,并创建一个文件夹与他们的名字。但是在文件夹名称中,非ascii字符和空格有时会产生问题,所以我想删除或更改为ascii字符。我可以删除名字和姓氏之间的空白,但我不知道如何更改' ' ->s, ç->c, ' ' ->g, ' ' -> I, ö->o。

下面是我的代码:
#!/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şil Aksoy' 'Cem Dalgıç'

它应该改变参数:CisilAksoy cemdalic

Thanks in advance

编辑:

我找到了这个解决方案,这看起来不太漂亮,但它有效。

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

EDIT2: SOLVED

#!/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 

任何将UTF-8转换为ASCII的方法都将是一种妥协。

iconv程序完成所要求的(不一定满足每个人,如将任何可转换的utf8字符音译为等效的ascii )。鉴于

 Çişil Aksoy' 'Cem Dalgıç
"foo.txt"中的

,以及命令

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

将得到

Cisil Aksoy' 'Cem Dalg?c

lynx浏览器有一组不同的ASCII近似。使用以下命令

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

我得到这样的结果:

C,isil Aksoy' 'Cem Dalgic,

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

我认为你最好的办法是确定为什么你的文件夹创建失败时使用这些字符。方法或函数不支持Unicode吗?如果是,弄清楚如何指定它而不是ASCII。否则,您可能会被困在sed和/或tr中,这可能是不可持续的。

(更新)

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

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

我删除了之前的评论。我在不同的服务器上尝试过,它工作得很好。

最新更新