0

我有一个包含一些特殊字符的文档,例如不间断空格、不间断连字符等。我想规范化这个文档并用空格替换这些特殊字符。另外,由于本文档的内容是从不同的资源中收集的,所以我在其中有不同形式的“Yeh”(ی),我想将它们规范化。

是否可以使用sed命令查找和替换文档中的 unicode 字符?我可以使用 Unicode 代码代替字符的表面形式吗?例如,我可以在 sed 命令中使用 x00a0 代替不间断空格吗?如何?


抱歉解释不好。我的文档以 UTF8 编码,并且包含非英文字符。例如,我有一份阿拉伯语文件、一份乌尔都语文件和一份波斯语(波斯语)文件。现在我想用另一个字符替换这些文件中的一些字符。通过规范化,我的意思是我想将所有形式的“Yeh”替换为一种形式。(正如您现在可能看到的那样,这个字符在阿拉伯语中有多种形式,但为了简化和一些处理问题,我想统一所有这些形式。

4

2 回答 2

1

要处理 UTF-8 文件,您必须从头到尾解析每个字符。如果您需要有效地做到这一点,您必须编写一个真正的程序,而不是尝试编写一个解决方案的脚本。

如果您只想编写脚本,将其转换为 UTF-16 然后处理字符会更容易。

一个相当低效的方法是:

#!/bin/bash
function px {
 local a="$@"
 local i=0
 while [ $i -lt ${#a}  ]
  do
   printf \\x${a:$i:2}
   i=$(($i+2))
  done
}
(iconv -f UTF8 -t UTF16 | od -x |  cut -b 9- | xargs -n 1) |
if read utf16header
then
 px $utf16header
 out=''
 while read line
  do
   if [ "$line" == "000a" ]
    then
     out=$out$line
     px $out
     out=''
    else
     # put your coversion logic here.
     # e.g
     # if [ "$line" == "0031" ] ;  then
     #    line="0041"
     # fi
     out=$out$line
   fi
  done
fi | iconv -f UTF16 -t UTF8
于 2012-06-30T20:06:46.390 回答
0

这可能对您有用(GNU sed):

echo abcd | sed 'p;y/\x61\x62\x63/ABC/'
abcd
ABCd
于 2012-06-30T08:28:55.167 回答