【问题标题】:Remove non-English and accented characters from a flat file using Unix shell script使用 Unix shell 脚本从平面文件中删除非英语和重音字符
【发布时间】:2011-03-01 09:57:40
【问题描述】:

我有一个文件,其中包含许多重音符号和一些通配符 (?, *) 字符。如何在 Unix 中用空格替换这些字符(使用 sed 或类似实用程序)。我使用 sed 尝试过,但不知何故它忽略了重音字符。

谢谢

【问题讨论】:

  • 你能显示无效的sed 命令吗?

标签: shell unix special-characters


【解决方案1】:

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

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

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

【讨论】:

  • 似乎范围无效? sed: -e 表达式 #1, char 91: 无效范围结束
  • @codeObserver:糟糕,那是因为“9”不是有效的八进制数字。事实上,我不知道这些数字是从哪里来的,但这是原理。
【解决方案2】:

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

首先,简单一点。让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 的正则表达式引擎。 perl -n 选项会创建一个隐式循环,这可能会使转换成为您想要的单线。

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 我有一个需要保留在文件中的字符列表,所有其他字符都需要替换为空格。这会让生活更简单吗?
    • 是的,如果您要处理 8 位字符,您可以再次使用 tr。只需使用互补集参数 -C 来反转字符集。 tr -C "$keep_these_chars" ' ' &lt; infile &gt; outfile.
    • 我尝试了以下方法来替换除 (A-Z、0-9 和其他字符之外的所有字符!" # $%&'()+) tr -c "\051-\057\064-\089\096-\0105\0112-\0121\0128-\0137\0144-\0145\0147\0150\0291-\0293" "" &lt; testme.txt &gt; out.log 但我得到了错误:* *tr: `4-\000' 的范围端点是反向整理顺序**
    • 以下命令有效:tr -c "\012\015\041\042\043\044\045\046\047\050\051\053\054\055\056\057\060\061\062\063\064\065\066\067\070\071\073\074\075\076\077\100\101\102\103\104\105\106\107\110\111\112\113\114\115\116\117\120\121\122\123\124\125\126\127\130\131\132\133\135\140\173\174\175" ' ' &lt; $file &gt; tmpfile.txt 其中所有数字都是字符的八进制值
    猜你喜欢
    • 2017-01-25
    • 1970-01-01
    • 2019-03-13
    • 2011-09-25
    • 1970-01-01
    • 2017-05-08
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多