在Bash中查找并替换非中断空格字符

时间:2012-06-30 07:38:38

标签: linux bash sed

我有一个带有一些特殊字符的文档,例如非破坏空格,非破坏连字符等。我想规范化这个文档并用空格替换这些特殊字符。另外由于本文档的内容是从不同的资源中收集的,因此我有不同形式的“Yeh”(ی),我想将它们标准化。

是否可以使用 sed 命令在文档中查找和替换unicode字符?我可以使用Unicode代码而不是字符的表面形式吗?例如,我可以在sed命令中使用x00a0而不是非破坏空间吗?怎么样?


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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

这可能适合你(GNU sed):

echo abcd | sed 'p;y/\x61\x62\x63/ABC/'
abcd
ABCd