여러 숫자가 포함된 정규식 파일 이름

여러 숫자가 포함된 정규식 파일 이름

다음과 같은 파일이 있다고 가정해 보겠습니다.

test_file-1234-master.tar.gz

tar다음 명령을 사용하여 취소를 시도했습니다.

 tar -xf test_file-[0-9]+-master.tar.gz
 tar -xf test_file-[:digit]-master.tar.gz

하지만 행운은 없습니다. 이 패턴을 어떻게 맞추나요?

노트:항상 파일이 있습니다. 여러 파일을 열고 싶지 않습니다.

답변1

+확장 정규식 메타문자와 POSIX 문자 클래스( 및 각각)를 와일드카드 패턴으로 사용하려고 했습니다 .[:digit:]

bash이와 유사한 "기본" 와일드카드는 몇 가지 와일드카드만 지원한다고 가정 합니다. 예를 들면 다음과 같습니다.

  • ?: 단일 문자
  • *: 0개 이상의 문자
  • []: 캐릭터 클래스
  • {}: 목록
  • [!]: 문자 클래스를 부정

확장 정규식의 메타 문자와 달리 "기본" 와일드카드에서는 와일드카드 동작을 고정된 발생 횟수와 일치하도록 수정할 수 없습니다.

따라서 "기본" 와일드카드를 사용하면 가장 짧고 간결한 패턴은 다음과 같습니다.

tar -xf test_file-[0-9][0-9][0-9][0-9]-master.tar.gz

답변2

ksh, 만 :bash -O extglobzsh -o kshglob

test_file-+([[:digit:]])-master.tar.gz

당신 은 bash설정해야합니다extglob옵션이 먼저입니다. 이는 +(...)특정 패턴이 하나 이상 발생하는 것과 일치합니다. [:digit:]괄호 안의 표현식 [...]이 POSIX 정의인 경우캐릭터 클래스여기에는 인도-아랍어 십진수( [[:digit:]]또는 동일)가 포함됩니다.[0123456789][0-9]

다음과 일치합니다.

test_file-1234-master.tar.gz
test_file-1-master.tar.gz
test_file-123456789-master.tar.gz

그럴 것이다아니요성냥:

test_file-1b-master.tar.gz
test_file--master.tar.gz
test_file-a1-master.tar.gz
test_file-abcd-master.tar.gz
test_file-Ⅵ-master.tar.gz # roman numeral
test_file-٨-master.tar.gz  # Eastern Arabic decimal digit

귀하의 질문에 있는 명령은 tar다음과 같이 수행되어야 합니다(루프 사용).

shopt -s extglob # bash
# setopt kshglob # zsh
for f in test_file-+([[:digit:]])-master.tar.gz; do
    tar xf "$f"
done

보다 관용적인 짧은 구문 zsh은 다음과 같습니다.

setopt extendedglob
for f (test_file-[0-9]##-master.tar.gz) tar xf $f

( regexp 및 or #의 확장 전역 변수 와 동일)*##+

관련 정보