와일드카드 정규식 및 Bash

와일드카드 정규식 및 Bash

bash에서 와일드카드를 사용해야 하는지 정규식을 사용해야 하는지 알 수 없습니다. Bash 쉘 스크립팅에 관한 내 책은 주제를 명확히 하지 않았고 결국 제대로 이해하지 못했기 때문에 특히 혼란스러웠습니다. 예를 들어 설명하면 다음과 같습니다. ... .(점) 문자는 "모든 단일 문자"를 의미합니다. 따라서 ac는 abc, aac, aqc 등과 모두 일치합니다.

좋아요, 좋아요. 정규 표현식이기 때문에 그가 틀렸다고 생각합니다. 하지만 제가 가장 먼저 한 일은 그것을 테스트하는 것이었습니다.

$ touch abc aac aqc
$ ls
aac  abc  aqc
$ ls a.c
ls: cannot access 'a.c': No such file or directory

그러던 중 구글에 접속해 '와일드카드 튜토리얼'이라는 게시물을 발견하고 '맞아 이게 다구나'라고 생각했습니다.

https://linuxhint.com/bash_globbing_tutorial/

그의 "와일드카드 지정" 중 절반은 와일드카드 없이 BRE를 사용하는 grep을 통해 수행되었기 때문에 나는 거의 즉시 이것이 모두 잘못되었다고 생각했습니다. 예를 들어 그는 다음과 같이 지적했습니다.

"$는 종결자를 정의하는 데 사용됩니다."

이는 정규식이 의미하는 바이고 와일드카드가 아니기 때문에 잘못된 것입니다. 그래서 나는 그것을 테스트합니다 :

$ ls
aac  abc  aqc
$ ls c$
ls: cannot access 'c$': No such file or directory

따라서 그가 Google에서 클릭한 첫 번째 링크도 잘못된 것입니다. 이 주제를 명확히 설명하는 책이나 온라인 게시물이 없는 것 같으므로 정규식과 와일드카드의 차이점을 확실히 정의하는 데 도움이 필요합니다.

답변1

정규식이 사용되는 유일한 곳은 생성된 연산자 bash입니다 . 이 경우 POSIX 확장 정규식입니다.=~[[ ... ]]

if [[ abc =~ ^a.b$ ]]; then
  echo 'abc matches the ^a.b$ ERE'
fi

다른 장소들:

  • case abc in (a?b) echo 'abc matches the a?b glob pattern'; esac
  • [[ abc = a?b ]] && echo 'abc matches the a?b glob pattern'
  • printf '%s\n' a?b:실제 와일드카드(파일 이름 생성, 경로 이름 확장)
  • printf '%s\n' "${var#a?b}" "${var%a?b}" "${var##a?b}" "${var%%a?b}" "${var/a?b/x}
  • compgen -G 'a?b'(와 동일 complete).
  • help 'r??d'

이것은 쉘 와일드카드(glob 패턴, 파일 이름/fnmatch 패턴)입니다.

info bash patternBash에 무엇이 있는지 구체적으로 확인하려면 실행하세요 . info -n conditional bash당신을 데려다 줄 것입니다조건부 구성[[ ... ]]거기에서 해당 연산자에 대한 설명을 찾을 수 있습니다 =~.

grep, find, vim, perl와 같은 다른 도구는 firefox서로 다른 상황에서 둘 중 하나 또는 둘 다를 사용할 수 있습니다. 해당 문서에서 알려줄 것입니다. 또한 두 가지 유형의 패턴 모두 다양한 스타일로 제공됩니다. 경험상 glob 패턴은 일반적으로 파일 이름(예: glob 또는 쉘의 find' -name/ -path)을 일치시키는 데 사용되는 반면 regexp는 임의의 텍스트를 일치시키는 데 사용됩니다.

ksh93은 glob에서 정규식(기본, 확장, Perl 유사 또는 고급)을 사용할 수 있는 셸입니다.

$ printf '%s\n' ~(E:^a.b$)
a=b
axb

zsh에서는 glob 한정자를 통해 glob에서 정규식(확장 또는 pcre)을 사용할 수 있습니다 e.

$ printf '%s\n' *(e['[[ $REPLY =~ "^a.b$" ]]'])
a=b
axb
$ zmodload zsh/pcre
$ printf '%s\n' *(e['[[ $REPLY -pcre-match "^a.b\z" ]]'])
a=b
axb

(여기서 \zPCRE는 ERE와 동일합니다. $예를 들어 PCRE는 $주제의 끝과 일치합니다.뿐만 아니라 주제 끝의 개행 문자 이전에도 마찬가지입니다.).

rematchpcre옵션 ( set -o rematchpcre)을 설정하면 ERE [[ =~ ]]대신 PCRE가 사용된다.

관련 정보