【问题标题】:Replacing non-ASCII characters or specific ASCII character with a space in file用文件中的空格替换非 ASCII 字符或特定 ASCII 字符
【发布时间】:2013-01-29 09:14:57
【问题描述】:

我想使用 shell 脚本、sed 或 Perl 将文件中的非 ASCII 字符或特定 ASCII 字符替换为空格。

首先是用空格替换文件中的所有非ASCII字符。我知道我们可以使用以下命令来完成

perl -pi -e 's/[[:^ascii:]]/ /g'

下游也不能接受某些 ASCII 字符,所以我想用空格替换这些字符。例如,下游不接受值为 0x19(EM - 介质结束)的 ASCII 字符,我想用空格替换它。

我还知道下游有问题的一系列 ASCII 字符,我想用空格替换它们。

我可以得到帮助来完成这项工作吗?

注意:我们系统中的 Perl 版本是 5.8.4。我想在 Solaris 10 机器上做这个练习。

谢谢

【问题讨论】:

  • 您的问题似乎比您描述的要复杂。请发布更相关的内容,而不是参与聊天来定义您的问题
  • @Borodin:我已经对我的问题给出了正确的描述。我不明白你为什么会有这种感觉并投了反对票。我已经清楚地解释了问题。我面临的问题是获得涵盖所有字符范围的适当解决方案。

标签: regex perl unix sed solaris


【解决方案1】:

您可以将它们添加到您的正则表达式中的字符类中。例如,要删除非 ASCII 字符,加上 \031 和(比如说)a-e 范围内的字符,您可以这样写:

perl -pi -e 's/[[:^ascii:]\031a-e]/ /g'

编辑添加:

针对您的新要求:

我必须将非 ASCII 字符替换为 DEC 128 及以上,但 DEC 145 - 148 和 DEC 150-151 除外。

你可以写:

perl -pi -e 's/[^[:ascii:]\x91-\x94\x96\x97]/ /g; s/\031/ /g;'

(注意从[:^ascii:]“非ASCII字符”到[:ascii:]“ASCII字符”的变化,以及从[...]“任何字符...”到[^...]“任何其他字符”的变化比..."。)

【讨论】:

  • 谢谢。假设我必须用空格替换 DEC 128 及以上版本的 ASCII,但 DEC 145 – 148 和 DEC 150-151 除外。那我们该怎么做呢?
  • @Chkusi:等等,这没有任何意义。对于 Perl,[:ascii:] 表示 0-127 范围内的字符。 “来自 DEC 128 及以上的 ASCII”本质上是矛盾的。
  • @FtLie:不,那是八进制。 (而且您错过了“和 DEC 150-151”部分。)
  • @ruakh 抱歉,我不应该将其称为 ASCII。这是我必须用 DEC 128 及更高版本替换非 ASCII 字符,但 DEC 145 - 148 和 DEC 150-151 除外。
  • @ruakh:在 Perl 语句中我需要正确使用十六进制值吗?上面的第二个 perl 语句中是否缺少“]”?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 2019-05-15
  • 1970-01-01
  • 2015-08-14
  • 1970-01-01
  • 2017-04-13
  • 1970-01-01
相关资源
最近更新 更多