ZSH 와일드카드 표현식에 중복 제약 조건을 통합하는 방법이 있는지 아는 사람이 있습니까?
예를 들어, "ABC"로 시작하고 뒤에 하나 이상의 숫자가 오는 모든 파일을 일치시키려면 grep one을 사용하여 다음을 수행합니다.
ls | grep -e "ABC[0-9]\+"
ZSH glob 문자열을 사용하여 이를 직접 수행할 수 있는 방법이 있습니까? 대략 다음과 같습니다.
ls "ABC[0-9]\+"
나는 탐색했다ZSH 문서비슷한 것을 검색했지만 지금까지 그러한 지원을 찾지 못했습니다.
이것이 가능한지 아는 사람이 있습니까?
답변1
예, 다음과 같은 ##
항목이 하나 이상 일치하는 데 사용됩니다 [0-9]
.
ABC[0-9]##
이 extendedglob
값을 설정해야 하며 기본값이면 충분합니다. 설정되지 않은 경우 먼저 설정하십시오.
setopt extendedglob
예:
% print -l ABC*
ABC
ABC75475
ABC8
ABC90
% print -l ABC[0-9]##
ABC75475
ABC8
ABC90
답변2
아래로 스크롤하여 "파일 이름 생성” 그리고 활성화extended_glob
(이것이 기본값이어야 하지만 이전 버전과의 호환성을 위한 것은 아닙니다) 또는ksh_glob
. zsh 확장 glob과 ksh는 모두 정규식의 모든 기능을 갖추고 있습니다.
ERE syntax ksh glob zsh extended glob
(foo)* *(foo) (foo)#
(foo)+ +(foo) (foo)##
(foo)? ?(foo) (|foo)
(foo|bar) @(foo|bar) (foo|bar)
정규식을 사용하는 대부분의 도구는 이를 다음과 같이 사용한다는 점을 명심하십시오.찾다하위 문자열과 일치해야 하는 패턴이지만 glob은 항상 전체 문자열과 일치해야 하는 패턴으로 사용됩니다. 예를 들어 일부 텍스트가 남아 있기 때문에 foofoobar
zsh glob과 일치하지 않습니다 .(foo)##
foofoo
Zsh에는 표현식 기능을 확장하지 않지만 특정 표현식을 더 쉽게 작성할 수 있게 해주는 추가 연산자가 있습니다. 연산자 ^
및 ~
( extended_glob
) 및 !(…)
( ksh_glob
)는 부정을 제공합니다. 예를 들어 or 를 제외한 모든 항목과 일치합니다 ^foo
. 이는 정규식 구문에서 다루기 어렵습니다 . 연산자 (zsh 특정, 필수 아님 )는 범위 내의 모든 정수와 일치합니다 . 그렇지 않거나 .!(foo)
foo
|[^f].*|f[^o].*|fo[^o].*
<…-…>
extended_glob
<3-11>
3
10
30
1
따라서 문자를 인쇄할 수 없는 등의 문제를 배제하고 ls | grep -e "ABC[0-9]\+"
다음과 같은 방법으로 작성할 수 있습니다.
print -lr -- *ABC[0-9]##*(N) # requires extended_glob
print -lr -- *ABC+([0-9])*(N) # requires ksh_glob
print -lr -- *ABC+<->(N)
그러나 "하나 이상의 숫자 그 다음 무엇이든"은 "숫자 그 다음 무엇이든"과 동일하므로 다음과 같이 쓸 수도 있습니다.
print -lr -- *ABC[0-9]*(N)
답변3
활성화 후 extendedglob
:
$ setopt extendedglob
$ print -rl -- perl[[:digit:]]##
perl5
또는 kshglob
활성화 및 bareglobqual
비활성화:
$ setopt kshglob
$ unsetopt bareglobqual
$ print -rl -- perl+([[:digit:]])
perl5
[:digit:]
현재 로캘에서 숫자로 간주되는 모든 항목과 일치합니다 . 단지 일치 0
시키 려면 리터럴을 9
설정 하거나 사용하십시오 .LC_ALL=C
[0123456789]
예를 들어 and 연산자를 사용할 수 있는 모든 곳에서 globbing 플래그를 {n,m}
사용하여 (#cN,M)
정규식 에서 일치 항목 수를 지정할 수 있습니다.#
##
(*/)#
(*/)##
$ print -rl -- perl[[:digit:]](#c1)
perl5
$ print -rl -- perl[[:digit:]](#c2)
zsh: no matches found: perl[[:digit:]](#c2)