이중 이스케이프/단일 이스케이프 개행 문자가 포함된 json 문자열이 있습니다. Json 파서는 문자열 값에 단일 백슬래시 이스케이프를 허용하지 않습니다.
탈출하려면 모두 모아야 해
내용은 다음과 같습니다.
this newline must not be changed ---- \\n
this newline must be changed - \n
sed 명령을 실행하면,
sed -i 's/([^\])\n/\\n/g' ~/Desktop/sedTest
그것은 아무것도 대체하지 않습니다
([^\])
\n
, 이 모드는 이미 추가 백슬래시가 있는 모드를 변경하지 않는 데 사용됩니다 .
답변1
예제 입력을 고려하면 다음과 같습니다.
$ cat /tmp/foo
this newline must not be changed ---- \\n
this newline must be changed - \n
이것은 당신이 원하는 것을 수행하는 것 같습니다 :
$ sed -e 's@\([^\]\)\\n@\1\\\\n@' /tmp/foo
this newline must not be changed ---- \\n
this newline must be changed - \\n
답변2
노력하다
sed -i 's,\([^\\]\)\\n,\1\\\\n,' file
sed -i 's,\([^\]\)\\n,\1\\\\n,' file
어디
\
다음으로 탈출해야 합니다.\\\\
\( .. \)
캡처 모드입니다\1
오른쪽에는 첫 번째로 캡처된 패턴이 있습니다.- 두 번째 형식은 @cuonglm이 제안한
\
단일 형식입니다 .[^\]
패턴을 보존해야 합니다. 그렇지 않으면 폐기됩니다.
답변3
LHS 에서는 \n
리터럴 대신 개행 문자를 일치시키려고 합니다 \n
.
노력하다:
sed -e 's/\([^\]\)\(\\n\)/\1\\\2/g' file
또는 더 짧은 확장 정규식:
sed -E 's/([^\])(\\n)/\1\\\2/g' file