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

관련 정보