Мне нужно быть эффективным, поэтому я не могу использовать инструменты, 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