$ echo 'output: " ' | sed "s/\"/\"/"
output: "
$ echo 'output: " ' | sed "s/\"/\\\"/"
output: "
$ echo 'output: " ' | sed "s/\"/\\\\\"/"
output: \"
첫 번째와 두 번째 예에서 무슨 일이 일어나고 있는지 이해하고 싶습니다. 내 이해는 표현식에 큰따옴표를 사용하고 있기 때문에 sed
으로 \"
해석되고 "
로 \\
해석된다는 것 입니다 \
. 그렇다면 왜 내 두 번째 출력이 "
아닌가 \"
?
나는 sed
as 에 작은 따옴표를 사용할 수 있다는 것을 알고 있습니다 '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과 동일합니다.