使用Unix shell脚本从平面文件中删除非英语和重音字符

时间:2011-02-28 22:18:16

标签: shell unix special-characters

我有一个包含大量重音和一些外卡(?,*)字符的文件。如何在Unix中用空格替换这些字符(使用sed或类似实用程序)。我尝试使用sed,但不知怎的,它忽略了重音字符。

由于

3 个答案:

答案 0 :(得分:1)

这不是一个非常具体的答案,但它应该为您提供一些搜索关键字。

首先,简单的一点。让sed匹配正则表达式字符很简单。例如:

% echo 'one tw? f*ur' | sed 's/\*/ /' 
one tw? f ur
% echo 'one tw? f*ur' | sed 's/[*?]/ /'
one tw  f*ur
%

处理非ASCII字符比较麻烦。

某些seds可以处理非ASCII字符,通常是unicode文件。有些seds不能。不幸的是,从你的sed的手册页中可能并不明显。生活很艰难。

您必须要弄清楚输入文件的编码是什么。一个unicode文件将以UTF-8或UTF-16(或可能是一个)中的一个或另一个编码几个不太常见的)。这不是扩展unicode和编码的地方,但这些是扫描联机帮助页的关键词....

即使你找不到可以处理unicode的sed,你也许可以使用perl,python或其他一些脚本语言来进行处理 - 这些通常都有可以执行unicode的regexp引擎。 perl -n选项会创建一个隐式循环,可能会使您想要的转换成为单行。

如果您的输入文档采用不同的(非unicode)编码,例如ISO-8859编码之一,那么我猜想最好的做法是使用类似的东西将其转换为UTF-8 iconv,然后从那里继续。

答案 1 :(得分:1)

使用GNU sed,您可以执行以下操作:

sed 's/[^\o51-\o57\o64-\o89\o96-\o105\o112-\o121\o128-\o137\o144-\o145\o147\o150\o291-\o293]/ /g' inputfile

请注意,在反斜杠后,它们是字母“O”而不是数字零。

答案 2 :(得分:0)

如果您的重音字符是单字节,您可以使用tr字符集来完成此操作。如果您可以识别要匹配的字符范围,那可能是最简单的:

tr '\192-\255' ' ' < infile > outfile

如果您正在处理大于8位的字符,awk和sed可能会处理它,但您需要确保输入被正确引用。尝试使用十进制或十六进制表示而不是字符本身。