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