sed 표현식에서 백슬래시와 큰따옴표(큰따옴표로 묶음)를 이스케이프합니다.

sed 표현식에서 백슬래시와 큰따옴표(큰따옴표로 묶음)를 이스케이프합니다.
$ echo 'output: " ' | sed "s/\"/\"/"
output: "

$ echo 'output: " ' | sed "s/\"/\\\"/"
output: "

$ echo 'output: " ' | sed "s/\"/\\\\\"/"
output: \"

첫 번째와 두 번째 예에서 무슨 일이 일어나고 있는지 이해하고 싶습니다. 내 이해는 표현식에 큰따옴표를 사용하고 있기 때문에 sed으로 \"해석되고 "\\해석된다는 것 입니다 \. 그렇다면 왜 내 두 번째 출력이 "아닌가 \"?

나는 sedas 에 작은 따옴표를 사용할 수 있다는 것을 알고 있습니다 's/"/\"/'.아니요의도된 것과 동일하게 작동하며 "로 대체됩니다 ".

왜 큰따옴표가 이런 식으로 동작하는지 정말 궁금합니다.

  • GNU bash, 버전 5.1.4(1)-릴리스(x86_64-pc-linux-gnu)
  • sed (GNU sed) 4.8

답변1

내부에쉘 사양:

2.2.3 큰따옴표

큰따옴표( "" )로 묶인 문자는 다음과 같이 백틱, 달러 기호 및 백슬래시 문자를 제외하고 큰따옴표 안에 있는 모든 문자의 리터럴 값을 유지해야 합니다.

(...)

백슬래시는 뒤에 다음 문자(특수 문자로 간주됨) 중 하나가 올 경우에만 이스케이프 문자로서의 특별한 의미를 유지해야 합니다.
$ ` " \ <newline>

그래서,

사례 쉘 이전 (당신이 보는 것) 쉘 이후 (Sed에서)
1 "s/\"/\"/" s/"/"/
2 "s/\"/\\\"/" s/"/\"/
"s/\"/\\\\\"/" s/"/\\"/

존재하다sed 사양, s주문하다:

이스케이프되지 않은 백슬래시 뒤에 "&" 이외의 문자, 백슬래시, 숫자, 개행 문자 또는 이 명령에 사용되는 구분 기호가 오는 의미는 지정되지 않습니다.

따라서 사례 2에서는 출력이 지정되지 않습니다(즉, Sed 구현은 이러한 사례를 원하는 대로 자유롭게 해석할 수 있습니다). GNU Sed는 \r캐리지 리턴을 위한 줄바꿈 \n등을 포함한 여러 특수 문자를 제공함으로써 이러한 자유로움을 활용합니다.설명서의 전체 목록). \"그 중 하나가 아니라 단순히 백슬래시를 제거하도록 선택합니다. 결과적으로 사례 2는 GNU Sed의 사례 1과 동일합니다.

관련 정보