我在配置文件中遇到了一些问题,这些配置文件包含不间断空格其中的字符。
我应该如何使用 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 A0
OP 实际上询问的 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。(