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\" \"\"\"\"\"\"\"\"\" \"

부정적인 LookBehind를 사용하여 이를 달성할 수 있습니다.https://www.regular-expressions.info/lookaround.html

관련 정보