7

У меня проблемы с файлами конфигурации, в которых есть неразрывные пробелы .

Как мне указать этот символ с помощью sed, чтобы я мог заменить его пробелом.

sed -n 's/ / /g'

примеры ошибок

service named restart
Stopping named:                                            [  OK  ]
Starting named: 
Error in named configuration:
named.localhost:2: unknown RR type 'SOA '
named.localhost:8: unknown RR type '@'
named.localhost:9: unknown RR type '127.0.0.1'
named.localhost:10: unknown RR type '::1'
.....

Я попытался включить строку из исходного файла оскорбления в этом посте. Это не швы, чтобы работать. Pastebin скачать швы, чтобы быть единственным инструментом, который хранит все оригинальные двоичные файлы. http://pastebin.com/ZqT1EWbS. Вы должны быть в состоянии скопировать оригинальную строку и пройти мимо нее, чтобы она работала в вашем терминале.

2 ответа2

15

Ответ на этот вопрос зависит от того, с каким из неразрывных пробелов вы столкнетесь.

Ниже приведены примеры того, как заменить каждый из неразрывных пробелов, упомянутых в заголовке вопросов, и, кроме того, версию UTF-8 (C2 A0), о которой фактически спрашивает OP в соответствии с выводом pastebin.

Все примеры используют printf для генерации вывода, поскольку он более переносим, чем echo . Символы пробела заменяются символами X , чтобы сделать вывод более понятным.

Примеры

HTML

printf '&#nbsp;\n' | sed 's/ /X/g'
printf ' \n'  | sed 's/&160;/X/g'
printf ' \n'  | sed 's/&[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 (восьмеричный дамп) весьма полезным, чтобы показать мне, каковы фактические значения hex / oct / binary для всей строки.

$ 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. Поэтому мне пришлось изменить строку sed в ответе @Thor, чтобы удалить ее.

Это то, что сработало для меня.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .