【问题标题】:Convert non-ASCII chars to Space [duplicate]将非 ASCII 字符转换为空格 [重复]
【发布时间】:2015-02-20 08:18:22
【问题描述】:

我想将 Unix 中所有出现的非 ASCII 字符替换为空格,但所有字符的组应转换为单个空格,例如:

CHAVEZ MONTA�O   should be converted to CHAVEZ MONTAO<followed by one space>

我该怎么做。我在 Perl 命令下面使用:

grep --color='auto' -P -n "[\x80-\xFF]" file.xml

但这是在一个空格中转换一个字符,这不是我想要的。

编辑1:

我知道CHAVEZ MONTA�O 转换为CHAVEZ MONTA O 更有意义。但是如果是的话就更好了

CHAVEZ MONTAO<followed by one space>

但也请推荐CHAVEZ MONTA O

【问题讨论】:

  • 我认为输出必须是CHAVEZ MONTA O
  • 不应该是CHAVEZ MONTA O吗?

标签: bash perl shell unix


【解决方案1】:

好像你想要这样的东西,

$ echo 'CHAVEZ MONTA�O' | perl -pe 's/[^[:ascii:]]+/ /g'
CHAVEZ MONTA O

$ echo 'CHAVEZ MONTA�O' | perl -pe 's/([^[:ascii:]]+)(.)/\2 /g'
CHAVEZ MONTAO 

$ echo 'CHAVEZ MONTA�O' | perl -pe 's/�/ /g'
CHAVEZ MONTA O

$ echo 'CHAVEZ MONTA�O' | perl -pe 's/�([[:ascii:]])/\1 /g'
CHAVEZ MONTAO 

【讨论】:

  • 如果我只想将 � 更改为一个空格怎么办?
  • 是的,上面变成了一个空格。看我的第二个更新...
  • 我的问题是如何搜索 � ,只是 unix 中的这组非 ascii 字符?有可能吗?
  • 直接给搜索模式。
【解决方案2】:

纯猛击:

shopt -s extglob
var="CHAVEZ MONTA�O"
echo "${var//+([^[:ascii:]])/ }"

【讨论】:

    【解决方案3】:

    如果你使用这个sed,你可以这样做:

    sed -s 's/[\d128-\d255]\+/ /' < INPUTFILE
    

    它将所有大于 128 的字符替换为一个空格。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-30
      • 2014-10-21
      • 1970-01-01
      • 2017-12-25
      • 2011-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多