Преобразование JSON с необработанными символами в строке.

root@solaris:~# svccfg -s name-service/switch
svc:/system/name-service/switch> setprop config/host = "files dns"
svc:/system/name-service/switch> listprop config
config                      application
config/default             astring     files
config/value_authorization astring     solaris.smf.value.name-service.switch
config/printer             astring     "user files"
config/host                astring     "files dns"
svc:/system/name-service/switch> exit
root@solaris11:~# svcadm refresh name-service/switch 
1
25.03.2019, 22:21
1 ответ

Вы можете использовать perl для замены всех элементов управления C0 на шестнадцатеричные escape-последовательности:

perl -pe 's/([\x01-\x1f])/sprintf("\\u%04x", ord($1))/eg' < test.json

Это

  1. Запускает программу в цикле, выводя результат в конце в стиле sed -(perl -pe)
  2. Соответствует каждому байту в диапазоне 01 -1f(s/([\x01-\x1f])/...g)
  3. Вычисляет порядковый номер байта(ord($1))
  4. Заменяет совпадающий байт результатомsprintf("\\u%04x", ord($1))(/e)

Это вставит \u0001, \u0002,..., \u001fвместо совпадающих байтов.

Это будет экранировать все символы новой строки таким же образом, поэтому, если в файле есть разрывы строк без кавычек, он будет (разрываться, в частности, текстовый файл будет иметь по крайней мере завершающий символ новой строки, но это может удаляться механически либо до, либо после ). В этом случае [\x01-\x09\x0b-\x1f]пропустит его, но не удастся, если есть истинные разрывы строк внутри кавычек.

Если в вашем файле есть разрывы строк как в кавычках, так и без кавычек, такая бесконтекстная замена не работает. Вам понадобится либеральный синтаксический анализатор JSON, который принимает файл как -, чтобы знать, какие из них нужно экранировать, а какие нет. Я не уверен в -раздаче.

2
28.07.2021, 12:17

Теги

Похожие вопросы