다음 파일이 포함된 디렉터리가 있다고 가정해 보겠습니다.
touch doc-mike.txt doc-jane.txt doc-susan.txt
다음 구조를 사용하여 스크립트에서 이러한 파일에 대해 특정 작업을 수행할 수 있습니다.
for fname in doc-*.txt; do
echo input: ${fname}
done
그러나 와일드카드와 일치하는 파일 이름의 하위 문자열을 얻으려면 몇 가지 어려운 과정을 거쳐야 합니다.
for fname in doc-*.txt; do
wildcard=${fname#doc-}
wildcard=${wildcard%.txt}
echo input: ${fname} output: output-${wildcard}.results
done
이것은 작동합니다:
input: doc-jane.txt output: output-jane.results
input: doc-mike.txt output: output-mike.results
input: doc-susan.txt output: output-susan.results
"*"
하지만 glob 와일드카드와 일치하는 하위 문자열을 얻는 더 좋고/쉬운 방법이 있어야 한다고 생각합니다.
답변1
내가 생각할 수 있는 가장 가까운 것은 BASH_REMATCH
bash가 정규식 리터럴의 결과를 해당 변수에 저장하기 때문입니다.
$ for fname in doc-*.txt; do
[[ $fname =~ doc-(.*).txt ]];
echo "input: ${fname} output: output-${BASH_REMATCH[1]}.results";
done
input: doc-jane.txt output: output-jane.results
input: doc-mike.txt output: output-mike.results
input: doc-susan.txt output: output-susan.results
(.*)
정규식의 첫 번째 그룹과 마찬가지로 BASH_REMATCH[1]
.
답변2
zsh
섞을 수 있어요glob 한정자, 기록 확장 수정자 및 globbing 플래그가세요.
다음을 통해 확장된 와일드카드 및 기록 패턴 교체 모드를 활성화했다고 가정합니다.
setopt extendedglob
setopt histsubstpattern
그럼 당신은 실행할 수 있습니다
print doc-*.txt(#q:s/(#b)doc-(*).txt/'${match[1]}'/)
이것은 출력됩니다
jane mike susan
평소와 같이 이것을 일반 파일만 선택하거나 단어의 시작/끝에 표현식을 고정하는 등 다른 한정자/수정자/플래그와 결합할 수 있습니다.
그러나 각 파일 이름을 반복하려는 경우 zsh
매개변수 확장을 중첩하여 코드를 다음과 같이 단순화할 수 있습니다.
for fname in doc-*.txt; do
print input: ${fname} output: output-${${fname#doc-}%.txt}.results
done
위의 (답장:귀하의 의견)은 단일 표현식을 사용하며 중간 변수가 필요하지 않습니다.
답변3
당신은 또한 시도할 수 있습니다
for fname in doc-*.txt; do
echo "input: ${fname} output: output-${fname:4:$((${#fname}-8))}.results"
done