파일 이름의 문자 위치로 Unix 파일 이름 검색

파일 이름의 문자 위치로 Unix 파일 이름 검색

2개의 파일이 있습니다.

  1. 파일 1 = ABC2019120601C
  2. 파일 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

를 사용하면 zshglob 한정자에서 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'])

관련 정보