sed, 단일 백슬래시를 이중 백슬래시로 변환

sed, 단일 백슬래시를 이중 백슬래시로 변환

이중 이스케이프/단일 이스케이프 개행 문자가 포함된 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

관련 정보