在 UTF-8 文件中将不间断空格替换为空格

在 UTF-8 文件中将不间断空格替换为空格

我在配置文件中遇到了一些问题,这些配置文件包含不间断空格其中的字符。

我应该如何使用 sed 指定该字符,以便我可以将其替换为空格。

sed -n 's/ / /g'

错误示例

服务名为重新启动
正在停止命名:[ 确定 ]
起始命名:
命名配置错误:
named.localhost:2:未知 RR 类型“SOA”
named.localhost:8:未知 RR 类型 '@'
named.localhost:9:未知 RR 类型“127.0.0.1”
named.localhost:10:未知 RR 类型‘::1’
.....

我尝试在这篇文章中包含一行来自原始违规文件的内容。但似乎行不通。Pastebin 下载似乎是唯一保留所有原始二进制文件的工具。http://pastebin.com/ZqT1EWbS。您应该能够复制并粘贴原始行并使其在您的终端中运行。

答案1

这个问题的答案取决于您遇到哪个不间断空格字符。

下面是根据 pastebin 输出如何替换问题标题中提到的每个不间断空格字符以及C2 A0OP 实际上询问的 UTF-8 版本()的示例。

所有示例均使用printf来生成输出,因为它比 更易于移植echo。空格字符被替换为 ,X以使输出更清晰。

例子

html

printf '&#nbsp;\n' | sed 's/&#nbsp;/X/g'
printf ' \n'  | sed 's/ /X/g'
printf ' \n'  | sed 's/&#x[aA]0;/X/g'

八进制 240 = 十进制 160 = 十六进制 A0

printf '\xA0\n' | sed 's/\xA0/X/g'

或者tr

printf '\xA0\n' | tr '\240' 'X'

U+00A0

printf '\x00\xA0\n' | sed 's/\x00\xA0/X/g'

UTF-8

printf '\xC2\xA0\n' | sed 's/\xC2\xA0/X/g'

结果

以上所有情况下的输出为:

X

回答

现在回答您的问题,您有如下数据:

printf '@       IN SOA  @ rname.invalid. (' | od -x

输出:

0000000 c240 c2a0 c2a0 c2a0 c2a0 c2a0 20a0 4e49
0000020 5320 414f a0c2 4020 7220 616e 656d 692e
0000040 766e 6c61 6469 202e 0a28
0000052

为了C2 A0用普通空格替换 s,请使用以下命令:

printf '@       IN SOA  @ rname.invalid. (' | sed 's/\xC2\xA0/ /g' | od -x

输出:

0000000 2040 2020 2020 2020 4e49 5320 414f 2020
0000020 2040 6e72 6d61 2e65 6e69 6176 696c 2e64
0000040 2820 000a
0000044

答案2

感谢所有帮助我找到可行解决方案的人。

我尝试在这篇文章中包含一行来自原始违规文件的内容。但似乎行不通。Pastebin 下载似乎是唯一保留所有原始二进制文件的工具。http://pastebin.com/ZqT1EWbS。您应该能够复制并粘贴原始行并使其在您的终端中运行。

\0240如果我删除八进制或十六进制,就会发生以下情况\xA0。它会添加一些其他奇怪的字符。

$ echo“@IN SOA@rname.invalid。(”|sed-e“s/\xA0//g”
@������ IN SOA� @ rname.invalid. (

实际文件中没有打印一些额外的数据。我发现od(八进制转储)该工具非常有用,可以向我显示整行的实际十六进制/八进制/二进制值。

$ echo“@IN SOA@rname.invalid。(”|od-x
0000000 c240 c2a0 c2a0 c2a0 c2a0 c2a0 20a0 4e49
0000020 5320 414f a0c2 4020 7220 616e 656d 692e
0000040 766e 6c61 6469 202e 0a28
0000052

另一个不断出现的字符是,当存在\xC2不间断空格时,它不会打印\xA0,但如果删除了 nbsp,它就会显示出来。所以我不得不修改@Thor 回答 将其删除。

这对我有用。

$ echo“@IN SOA@rname.invalid。(”|sed-e“s/\xC2\xA0//g”
@IN SOA@rname.invalid。(

答案3

在 UTF-8 文件中将不间断空格替换为空格

TLDR 版本托尔的回答

sed -i 's/\xC2\xA0/ /g' filename

相关内容