티스토리 뷰

Shell 이 수행하는 filename expansion 을 globbing 이라고 한다네요. 

파일이나 디렉토리 이름을 매치시키키 위해 사용됩니다.

 

테스트를 위해 몇 개의 파일을 만듭니다.

 

 

globbing pattern으로 간주되지는 않지만 curly brace { } 를 이용해서 한꺼번에 여러 개의 파일을 만들 수 있습니다. 

이를 중괄호 확장이라고 한답니다.

 

{a,b,c} 어느 부분에도 공백을 집어넣어 띄어쓰기하면 안되는 이유는 첫 글에서 다루었습니다.

이왕 중괄호 확장이 나왔으니 하나만 더! 

 

 

{1,2,3,4,5,6,7} 대신 {1..7} 을 사용할 수 있네요.

 

 

globbing  패턴은 와일드 카드 문자 * , ? 와 대괄호 [ ] 를 사용합니다.

 

? 는 아무거나 한 문자,  * 는 아무 문자열을  뜻합니다. [ ] 는 정규식과 같은 방식으로 사용됩니다.

 

 

여기서는 * 이 두 문자에 매치되었습니다.

이처럼 globbing 패턴 자체는 어렵지 않습니다.

 

그런데 와일드 카드 문자들이 정규식에도 메타 문자로 사용되기 때문에 혼란스럽죠.

정규식에서는 

 

* 는 직전 item 을 0 번 이상 반복 , ? 는 직전 item 을 1 번 이하로 사용 (item 은 한 문자 혹은 문자열 group)

 

입니다.  따라서  *sh 같은 패턴은 정규식에서는 있을 수 없습니다.  

왜냐하면 * 앞에 뭐가 없기 때문이죠. 구별을 위해 다음의 패턴을 봅시다.

 

a*

 

위의 패턴은 정규식에서는 a 가 0 번 이상 반복되는 문자열을 의미하고,

globbing 에서는 a 로 시작되는 아무 문자열 전부를 의미합니다.

둘은 전혀 다르죠.

 

테스트를 위해 디렉토리의 모든 파일을 지우고 a.txt 라는 파일 하나를 만듭니다.

 

 

내용은 위와 같습니다. grep 명령어를 사용해 봅시다. 

 

grep pattern file

 

grep 은 위의 형태로 사용되어 file 에서 pattern 에 매칭되는 line 들을 보여줍니다.

 

 

빨간색으로 표시된 문자열이 정규식 패턴 a* 에 매치된 것들입니다. 

grep 명령어에 매치된 행의 번호를 출력하는 -n 옵션을 사용해서 공백문자열(a 가 0개) 도 매치되었음을 확인했습니다.

 

마지막의 a* 는 globbing 패턴으로 a 로 시작되는 파일을 찾습니다. 그리고 a.txt 가 되겠죠.

 

 

- Shell 은 정규식을 이해하지 못한다!

 

위의 예에서 첫 인자의  " 를 생략하고

grep a* a*

 

 

를 하면 어떻게 될까요? grep 뒤에 a* 두 개를 모두 globbing 하게 됩니다. 즉, 파일이나 디렉토리 이름이 a 로 시작되는 것을 찾습니다.

 

현재 a.txt 하나 밖에 없으니 위의 명령은

 

grep a.txt a.txt

 

와 같은 것이 됩니다. a.txt 의 내용에는 a.txt 가 없으니 매치되는 것이 없습니다.

 

 

확인을 위해 이번에는 파일 마지막에 문자열 a.txt 를 추가하고 위의 명령을 실행해 보세요.

 

 

아무리 따옴표를 생략했다고 해도 grep 명령어의 첫 인자를 정규식이 아니라 globbing 하는 것은 납득하기 힘들지만...

 

하여간 shell 은 정규식을 이해하지 못하니 * 같은 문자를 만나면 globbing 을 하고,

이때 매치된 파일명이 있으면 그것을 정규식 패턴삼아 나머지 작업을 수행합니다.

 

정규식은 grep, sed, awk 같은 명령들이 사용하는 것이지 shell 이 사용하는 것은 아닙니다!

 

 

 

globbing 이야기가 나온 것은 변수 확장 때문이었습니다. 변수 확장은 shell 이 수행하는 것이니

 

${name#pattern}

 

에서 pattern 은 globbing pattern 인 겁니다.

 

자! 그럼 다음의 script 를 first.sh 로 

 

#!/bin/bash
#first.sh 

num=-3504
abs=${num#?}
 
echo $abs

 

뭐가 출력될까요?  

 

# 은 변수인 문자열 num 의 앞부분에서 패턴을 잘라냅니다.

? 는 아무거나 한 문자와 매치되죠.

결국, 첫 문자 - 를 없앤 3504가 출력됩니다.

 

 

이번에 다룬 것을 정리합니다.

 

1. globbing 은 무엇인가? - shell 이 파일, 디렉토리와 매치시키는 패턴!

 

2. 정규식 두 메타문자  * , ? 의 용법 - globbing 과의 차이점

 

3. grep 의 기초적인 사용법 ( 가급적이면 pattern 에 " 를 사용해야하는 이유)

 

변수확장와 관련된 내용들 볼륨이 커서 나누어서 다루겠습니다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함