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
Вы можете использовать perl для замены всех элементов управления C0 на шестнадцатеричные escape-последовательности:
perl -pe 's/([\x01-\x1f])/sprintf("\\u%04x", ord($1))/eg' < test.json
Это
perl -pe
)s/([\x01-\x1f])/
...g
)ord($1)
)sprintf("\\u%04x", ord($1))
(/e
)Это вставит \u0001
, \u0002
,..., \u001f
вместо совпадающих байтов.
Это будет экранировать все символы новой строки таким же образом, поэтому, если в файле есть разрывы строк без кавычек, он будет (разрываться, в частности, текстовый файл будет иметь по крайней мере завершающий символ новой строки, но это может удаляться механически либо до, либо после ). В этом случае [\x01-\x09\x0b-\x1f]
пропустит его, но не удастся, если есть истинные разрывы строк внутри кавычек.
Если в вашем файле есть разрывы строк как в кавычках, так и без кавычек, такая бесконтекстная замена не работает. Вам понадобится либеральный синтаксический анализатор JSON, который принимает файл как -, чтобы знать, какие из них нужно экранировать, а какие нет. Я не уверен в -раздаче.