효율적이어야 하기 때문에 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