콘텐츠로 이동

Regular expressions and wildcards

GNU/Linux 운영 체제에서, 정규 표현식과 와일드카드는 종종 같은 기호(또는 스타일)을 사용하기 때문에 사람들은 이들을 혼동하기 쉽습니다.

정규 표현식과 와일드카드의 차이점은 무엇일까요?

유사점:

  • 같은 기호를 가지고 있지만, 완전히 다른 의미를 나타냅니다.

차이점:

  • 정규 표현에는 파일 콘텐츠와 일치하는 파일 또는 디렉토리 이름을 일치하도록 사용됩니다.
  • 정규 표현식은 grep, sed, awk 등의 명령어에서 사용될 수 있습니다; 와일드카드는 cp, find, mv, touch, ls 등의 명령어에서 사용됩니다.
  • 와일드카드는 일반적으로 'cp', 'find', 'mv', 'touch', 'ls' 등과 같은 명령어와 함께 사용됩니다.

GNU/Linux에서의 와일드카드

GNU/Linux OS는 다음과 같은 와일드카드를 지원합니다:

와일드카드 스타일 역할
? 파일 또는 다이렉토리 이름의 한 문자와 일치합니다.
- 파일 또는 디렉토리 이름의 0개 이상의 임의 문자와 일치합니다.
[ ] 괄호 안의 어떤 단일 문자와도 일치합니다. 예를 들어, [one]은 o 또는 n 또는 e와 일치한다는 의미입니다.
[-] 괄호 안에 주어진 범위의 어떤 단일 문자와도 일치합니다. 예를 들어, [0-9]는 0에서 9까지의 어떤 단일 숫자와 일치합니다.
[^] "논리적 비"로 단일 문자와 일치합니다. 예를 들어,[^a-zA-Z] 는 단일 비문자 문자와 일치합니다.
{,} 여러 개의 단일 문자가 연속적으로 일치하지 않습니다. 쉼표로 구분합니다.
{..} [-] 와 동일합니다. 예를 들어 {0..9} 및 {a..z}

다른 명령어들은 와일드카드 스타일을 다르게 지원합니다:

  • find: *, ?, [ ], [-], [^] 지원
  • ls: 모두 지원
  • mkdir: {,} 및 {..}
  • touch: {,} 및 {..}
  • mv: 모두 지원
  • cp: 모두 지원

For example:

Shell > mkdir -p /root/dir{1..3}
Shell > cd /root/dir1/
Shell > touch file{1,5,9}
Shell > cd 
Shell > mv /root/dir1/file[1-9]  /root/dir2/
Shell > cp /root/dir2/file{1..9} /root/dir3/
Shell > find / -iname "dir[1-9]" -a -type d

GNU/Linux에서의 정규 표현식

역사적 발전으로 인해 정규 표현식에는 두 가지 주요 학파가 존재합니다:

  • POSIX:
  • BRE(기본 정규 표현식)
  • ERE(확장 정규 표현식)
  • POSIX 문자 클래스
  • PCRE (Perl 호환 정규 표현식): 다양한 프로그래밍 언어에서 가장 일반적입니다.
BRE ERE POSIX 문자 클래스 PCRE
'grep'
(-E 옵션 필요)

(-P 옵션 필요)
'sed'
(-r 옵션 필요)
×
'awk' ×

정규 표현식에 대한 더 많은 정보를 원한다면, 이 웹사이트를 방문하여 유용한 정보를 더 알아보세요.

BRE

BRE (기본 정규 표현식)은 UNIX 시스템의 grep 명령어와 ed 텍스트 편집기에 의해 도입된 가장 오래된 유형의 정규 표현식입니다.

메타문자 description bash 예제
- 이전 문자의 발생 횟수와 일치하며, 이는 0 또는 어떤 횟수든 가능합니다.
. 줄 바꿈을 제외한 어떤 단일 문자와 일치합니다.
^ 줄의 시작 부분과 일치합니다. 예를 들어 - ^h는 h로 시작하는 줄과 일치합니다.
$ 줄의 끝 부분과 일치합니다. 예를 들어 - **h$**는 h로 끝나는 줄과 일치합니다.
[] 괄호 안에서 지정된 어떤 단일 문자와 일치합니다. 예를 들어 - **[who]**는 w, h, o 중 하나와 일치합니다; **[0-9]**는 한 자리 숫자와 일치하며 **[0-9][a-z]**는 한 자리 숫자와 소문자 글자로 구성된 문자와 일치합니다.
[^] 괄호 안에서 지정된 문자를 제외한 어떤 단일 문자와 일치합니다. 예를 들어, **[^0-9]**는 숫자가 아닌 모든 문자와 일치합니다. **[^a-z]**는 소문자가 아닌 모든 단일 문자와 일치합니다.
\ 일부 특수 기호가 나타내는 의미를 취소하기 위해 사용되는 이스케이프 문자입니다. echo -e "1.2\n122" \\| grep -E '1\.2'
1.2
\{n\} 이전 단일 문자의 발생 횟수와 일치하며 n은 일치 횟수를 나타냅니다. echo -e "1994\n2000\n2222" \\| grep "[24]\{4\}"
2222
\{n,\} 이전 단일 문자를 적어도 n번 일치시킵니다. echo -e "1994\n2000\n2222" \\| grep "[29]\{2,\}"
1994
2222
\{n,m\} 이전 단일 문자를 최소 n번 이상 최대 m번까지 일치시킵니다. echo -e "abcd\n20\n300\n4444" \\| grep "[0-9]\{2,4\}"
20
300
4444

ERE

메타문자 description bash 예제
+ 이전 단일 문자의 발생 횟수와 일치하며 1회 이상이 될 수 있습니다. echo -e "abcd\nab\nabb\ncdd" \\| grep -E "ab+"
abcd
ab
abb
? 이전 단일 문자의 발생 횟수와 일치하며 0 또는 1회가 될 수 있습니다. echo -e "ac\nabc\nadd" \\| grep -E 'a?c'
ac
abc
\< 문자열의 시작 부분과 일치하는 경계 문자입니다. echo -e "1\n12\n123\n1234" \\| grep -E "\<123"
123
1234
\> 문자열의 끝 부분과 일치하는 경계 문자입니다. echo -e "export\nimport\nout" \\| grep -E "port\>"
export
import
() 조합적 일치, 즉 괄호 안의 문자열을 조합으로 취하고 일치시킵니다. echo -e "123abc\nabc123\na1b2c3" \\| grep -E "([a-z][0-9])+"
abc123
a1b2c3
\ 파이프라인 기호는 "또는"의 의미를 나타냅니다.

ERE는 특수 의미를 가진 문자도 지원합니다:

특수 문자 description
\w [a-zA-Z0-9] 와 동일
\W [^a-zA-Z0-9] 와 동일
\d [0-9] 와 동일
\D **[^0-9]**와 동일
\b \< 또는 **\>**와 동일
\B 경계 문자가 아닌 문자와 일치합니다.
\s 모든 공백 문자와 일치합니다. **[ \f\n\r\t\v]**와 동일
\S **[^ \f\n\r\t\v]**와 동일
공백 문자 description
\f 개행 문자와 일치합니다. \x0c\cL와 동일
\n 개행 문자와 일치합니다. \x0a\cJ와 동일
\r 단일 캐리지 리턴을 일치시킵니다. \x0d\cM와 동일
\t 단일 탭을 일치시킵니다. \x09\cI와 동일
\v 수직 탭 문자와 일치합니다. \x0b\cK와 동일

POSIX 문자 클래스

가끔 "POSIX 문자 클래스"(또는 "POSIX 문자")를 볼 수 있습니다. 그러나 저자 자신은 "POSIX 문자 클래스"를 거의 사용하지 않으므로 이 섹션은 기본적인 이해를 위한 것입니다.

POSIX 문자 클래스 해당하는 것
[:alnum:] [a-zA-Z0-9]
[:alpha:] [a-zA-Z]
[:lower:] [a-z]
[:upper:] [A-Z]
[:digit:] [0-9]
[:space:] [\f\n\r\t\v]
[:graph:] [^ \f\n\r\t\v]
[:blank:] [ \t]
[:cntrl:] [\x00-\x7F\x7F]
[:print:] [\x20-\x7E]
[:punct:] [][!"#$%&'()*+,./:;<=>?@^_`{\
[:xdigit:] [A-Fa-f0-9]

정규 표현식 소개

온라인에서 정규 표현식 스킬을 연습할 수 있는 많은 웹사이트가 있습니다.

Author: tianci li