Как написать процедуру для экранирования двойных кавычек в строке JSON

Как написать процедуру для экранирования двойных кавычек в строке JSON

Мне нужно быть эффективным, поэтому я не могу использовать инструменты, jqкоторые загружают большой исполняемый файл. Я просто хочу экранировать двойные кавычки в строке, чтобы это было безопасно для JSON. Этого недостаточно:

echo ' bad \"  string"' | sed 's/"/\\"/g' 

потому что он экранирует двойные кавычки, которые уже экранированы. Есть ли способ заменить двойные кавычки, только если они еще не экранированы?

решение1

Вероятно, вы хотите экранировать только "те символы, которым предшествует \.

echo ' bad \"  string"' | sed -E 's/([^\]|^)"/\1\\"/g'

Объяснение

Это будет соответствовать ", но только если ему предшествует [^\], что является "любым символом, кроме \" (или началом строки ^). Однако, поскольку этот новый символ будет заменен сам по себе, нам нужно захватить его в группу захвата (), а затем снова заменить его на соответствие \1. В этом примере я использовал расширенные регулярные выражения с -Eдля простоты.

решение2

$ echo ' bad \"  string"' | perl -pe 's/(?<!\\)"/\\\"/g'
 bad \"  string\"
$ echo ' bad \"  string" """""""""' | perl -pe 's/(?<!\\)"/\\\"/g'
 bad \"  string\" \"\"\"\"\"\"\"\"\"
$ echo ' bad \"  string" """"""""" \"' | perl -pe 's/(?<!\\)"/\\\"/g'
 bad \"  string\" \"\"\"\"\"\"\"\"\" \"

Используя отрицательный ретроспективный анализ, вы можете добиться этого.https://www.regular-expressions.info/lookaround.html

Связанный контент