인프런 커뮤니티 질문&답변

SodiumSulfate님의 프로필 이미지
SodiumSulfate

작성한 질문수

리눅스 쉘 스크립트 마스터

sed 명령어 강의에서 사용된 예제 중 질문이 있습니다.

작성

·

265

1

명령어 sed를 다루는 강의를 보다가 의문점이 있어서 질문드립니다.

SP=$' ';TAB=%'\t';sed -E 's/'"(${SP}|${TAB})"'{2,5}.+$//' president.txt

질문 1.

위의 명령 줄에서 s/다음에 (${SP}|${TAB}) 양 쪽에 작은 따옴표와 큰 따옴표를 같이 붙여주셨는데 이유를 좀 자세히 설명 부탁드려도 될까요?

변수 SP와 TAB을 사용하기 위해서 큰 따옴표 ""를 붙여야할 것 같긴한데 작은 따옴표도 왜 같이 붙여야 되는지 잘 모르겠습니다.

질문 2.

그리고 SP와 TAB 변수를 선언할 때 앞에 $를 붙여주셨는데 이 것은 공백문자와 개행문자를 특수 문자 형태로 변수에 저장하기 위함인가요? 시스템 생성 대체 텍스트:
큰 따옴표( DOUBLE QUOTES ) 
• 그 안의 텍스트가 여러 단어나 인수로 분리되지 않도록 보호합니다 
큰 따옴표 내의 문자들을 대체 
(Substitution)하는 것이 가능하다. 
\(백 슬래시). $(달러). ` (백틱) 를 
제외한 대부분의 다른 특수 문자의 의미는 
억제됩니다(즉, 일반문자로 해석됩니다).

수업에서 큰따옴표만 써도 백슬래쉬 같은 건 특수 문자 의미가 억제되지 않는걸로 설명을 들었는데 여기선 왜 되지 않는지 궁금합니다.

양질의 강의 제공해주셔서 감사합니다.

답변 2

1

SodiumSulfate님의 프로필 이미지
SodiumSulfate
질문자

이해하는데 큰 도움되었습니다. 감사합니다~

1

홍영기님의 프로필 이미지
홍영기
지식공유자

ultraraptor 님 안녕하세요?

질문주셨네요. 쉘 프로그래밍에서 가장 난해한 부분이 인용부호 사용입니다.

자! 찬찬히 설명드려볼게요

(질문1)

인용부호는 작은따옴표로 시작했다면 끝나는 부분도 작은따옴표입니다. 이건 이해하시는데 무리 없으시죠?

자 예시를 보시죠.

SP=$' ';TAB=%'\t';sed -E 's/'"(${SP}|${TAB})"'{2,5}.+$//' president.txt

                                                      (A)               (B)                     (C)

(A) 's/'

(B) "(${SP}|${TAB})"  . . . . . . 확장이 일어나도록 하는것이 목적(큰 따옴표를 이용)

(C) '{2,5}.+$//'

sed 명령어 앞에 echo 명령어를 추가해보세요. 그럼 궁금하신 부분이 해결될거에요.

bash-3.2$ SP=$' ';TAB=$'\t';echo sed -E 's/"(${SP}|${TAB})"{2,5}.+$//' president.txt

sed -E s/"(${SP}|${TAB})"{2,5}.+$// president.txt

bash-3.2$ SP=$' ';TAB=$'\t';echo sed -E 's/'"(${SP}|${TAB})"'{2,5}.+$//' president.txt

sed -E s/( | ){2,5}.+$// president.txt  . . . . . . 확장이 일어나도록 하는것이 목적(큰 따옴표를 이용)

bash-3.2$

(질문2)

배쉬 매뉴얼에 보면 다음과 같은 설명이 있습니다

" Words of the form $'string' are treated specially.  The word expands to

   string, with backslash-escaped characters replaced as specified by  the

   ANSI  C  standard .... 중략 "

bash-3.2$ STR=$'Hello\nWorld'

bash-3.2$ echo "$STR" | hexdump -C

00000000  48 65 6c 6c 6f 0a 57 6f  72 6c 64 0a              |Hello.World.|

0000000c

bash-3.2$ STR='Hello\nWorld'

bash-3.2$ echo "$STR" | hexdump -C

00000000  48 65 6c 6c 6f 5c 6e 57  6f 72 6c 64 0a           |Hello\nWorld.|

0000000d

bash-3.2$

$' ' 은 인용부호 내부의 이스케이프된 문자가 그 효력을 유지하게끔 하기 위해서 사용한다는 것을 알 수 있습니다.

- 끝 -

SodiumSulfate님의 프로필 이미지
SodiumSulfate

작성한 질문수

질문하기