티스토리 뷰
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 에 " 를 사용해야하는 이유)
변수확장와 관련된 내용들 볼륨이 커서 나누어서 다루겠습니다.
'Programming Language > Shell Programming' 카테고리의 다른 글
Bash Scripting 05 - 변수확장 (3) (0) | 2022.07.20 |
---|---|
Bash Scripting 04 - 변수확장(2) (0) | 2022.07.14 |
Bash Scripting 02 - 변수확장(1) (0) | 2022.07.09 |
Bash Scripting 01 - 공백! (0) | 2022.07.09 |
Bash Scripting 모르면 곤란한 것들 - if (3) (0) | 2022.07.06 |
- Total
- Today
- Yesterday
- stack
- 정수론
- javascript array
- python3
- Reference
- Dijkstra
- map
- JavaScript
- bash script
- BOJ
- segment tree
- 다익스트라
- shell
- 백준
- RUBY
- script
- Aho-Corasick
- lazy propagation
- dynamic programming
- number theory
- Vim
- nearest common ancestor
- fenwick tree
- Shell Programming
- max flow
- math font
- bash
- C++ big number
- persistent segment tree
- 세그먼트 트리
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |