다음과 같은 파일이 있다고 가정해 보겠습니다.
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 extglob
zsh -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 #
의 확장 전역 변수 와 동일)*
##
+