문자열 입력을 sed로 이스케이프합니다.


0

새 줄이 포함 된 문자열로 sed를 사용하는 파일에서 문자열을 바꾸는 데 문제가 있습니다. 다음은 완전히 실패합니다. 나는 replace_with 문자열을 벗어나야 만한다고 가정하지만, 어떻게 할 수 없으며, 이것이 최선의 방법 일지라도 해결할 수는 없습니다. 어떤 도움을 주시면 감사하겠습니다.

REPLACE_WITH="Blah
 de
 blah."

sed -i "s/TO_REPLACE/$REPLACE_WITH/g" file

답변:


0

이것은 "이중 탈출"이 필요하지만 이스케이프 문자는 sed의 "s"명령에 도달해야하므로 bash 쉘에서도 이스케이프해야합니다. ( "트리플 이스케이프"?)

REPLACE_WITH="Blah\\
de\\
blah."

sed -i "s/TO_REPLACE/$REPLACE_WITH/g" file

Bash는 "\\"를 하나의 "\"로 디코딩하고 send 명령에 하나의 '\'를 넣고 sed 명령은 끝나지 않은 개행을 의미하는 '\ {newline}'으로 해석합니다. 명령.

각 행의 끝에 '\'가 하나만 있다면 bash는 '\ {newline}'을 'nothing'으로 간주합니다. 즉, 개행과 백 슬래시는 완전히 제거됩니다.

bash-sed-awk에 대한 기본 규칙 ... 백 슬래시가 작동하지 않으면 다시 두 번 시도하십시오.


불행히도, 그것은 한 번 sed가 실행되면 (정확한 줄 바꿈으로) 다음을 생성합니다. - REPLACE_WITH = "Blah \ de \ blah."
David Davies-Jones

네, 그렇습니다. 문자열의 백 슬래시는 sed 스크립트에서 다중 행 s /// 명령을 작성해야합니다. 일반 문자열을 "파일"을 수정하기 위해 충분히 인용 된 문자열로 인용하고 싶다면 아마도 추가 sed 명령이 필요할 것입니다 ... 그게 당신이 원하는 것입니까?
user3710044

그냥 내가 잘못된 스크립트를 테스트하고 있다는 것을 깨달았습니다. 다시 :( 지금은 미안하려고합니다
데이비드 데이비스 존스에게

마침내 올바른 스크립트로 테스트 해 보았습니다. 감사합니다. :)
David Davies-Jones
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.