2개의 파일이 있습니다.
- 파일 1 = ABC2019120601C
- 파일 2 = ABC2019120611C
ls -l ABC*C를 입력하면 2개의 파일이 모두 출력됩니다. 정확한 문자 위치로 파일을 찾는 방법이 있나요?
예를 들어
- 첫 번째 위치 = A
- 두 번째 위치 = B
- 세 번째 위치 = C
- 비트 14 = C
그러면 ABC2019120601C 파일만 출력됩니다. 가능하다면 도와주세요.
답변1
0개 이상의 문자를 일치시키는 ?
대신 단일 문자를 일치시키는 데 사용할 수 있습니다 . *
예를 들어
ls -ld ABC??????????C
하지만 참고하세요둘 다예시 파일 이름은 기준과 일치합니다(12번째 문자만 다름).
답변2
를 사용하면 zsh
다음을 수행할 수 있습니다.
set -o extendedglob # best in ~/.zshrc
ls -ld ABC?(#c10)C*
여기서는 이전 원자의 반복 간격을 지정하는 (#cx,y)
정규 표현식과 유사합니다 ( 여기서는 단일 문자와 일치).{x,y}
?
ksh93의 해당 내용은 다음과 같습니다.
ls -ld ABC{10}(?)C*
bash
/ sh
에 해당하는 것은 없지만 문자가 포함되지 $IFS
않는다고 가정하면 ?
다음을 수행할 수 있습니다.
repeat() {
awk -- '
BEGIN {
for (i = 0; i < ARGV[1]; i++) printf "%s", ARGV[2]
if (ARGV[1]) printf "\n"
}' "$@"
}
ls -ld ABC$(repeat 10 '?')C
ksh93을 사용하여 위치별로 검색하려면 예측 연산자를 사용할 수 있습니다.
ls -ld ~(P:(?=.{0}(A))(?=.{1}(B))(?=.{2}(C))(?=.{13}(C))*
오프셋은 0, 1, 2, 13입니다.
~(P:...)
:ksh93 glob은 여러 가지 다른 구문을 사용할 수 있습니다. Perl과 유사한 정규 표현식이 여기에 사용됩니다.(?=...)
내부적으로 일치하는 경우 너비가 0인 위치에서 일치하는 Perl과 같은 정방향 조회 어설션입니다..{13}(C)
: C 뒤에 13개의 문자가 오는 것과 일치합니다. 모든(?=...)
일치 항목의 너비가 0이므로 항목 시작 부분에서 모두 일치하게 됩니다. ksh93의 버그를 해결하는.{13}(C)
대신 사용합니다 ..{13}C
를 사용하면 zsh
glob 한정자에서 PCRE 일치를 수행하여 동일한 작업을 수행할 수 있습니다.
set -o rematchpcre
ls -ld *(e['[[ $REPLY =~ "^(?=.{0}A)(?=.{1}B)(?=.{2}C)(?=.{13}C)" ]]'])
아니면
ls -ld *(e['[[ $REPLY[1,3]$REPLY[14] = ABCC ]]'])
또는 다음과 같은 도우미 함수를 사용하세요.
offsets() {
local c o
for o c {
[[ $REPLY[o] = $c ]] || return
}
}
ls -ld *(e['offsets 1 A 2 B 3 C 14 C'])