파일 이름의 일부를 추출하려고 하는데 첫 번째 _ 이후의 모든 내용을 추출하고 싶습니다. 작동하는 솔루션을 찾았습니다. 아래를 참조하세요.
file=22NGS71294_S191_R1_001.fastq.gz
echo $file
22NGS71294_S191_R1_001.fastq.gz
echo ${file#*[_ ]}
S191_R1_001.fastq.gz
그러나 와일드카드를 사용하면 작동이 중지됩니다.
file2=*R1*
echo $file2
22NGS71294_S191_R1_001.fastq.gz
echo ${file2#*[_ ]}
22NGS71294_S191_R1_001.fastq.gz
$file 및 $file2에 대한 echo 명령이 정확히 동일한 결과를 제공하기 때문에 이것이 작동하지 않는 이유를 모르겠습니다. 누군가 이 동작을 설명할 수 있나요?
답변1
sh
, ksh
, bash
( 또는zsh
아니요이 globassign
옵션이 설정된 경우) 스칼라 할당의 RHS에서 파일 이름 생성(일명 "globbing")이 발생하지 않습니다.file2=*R1*
당신의 echo $file2
보상은 22NGS71294_S191_R1_001.fastq.gz
다음과 같습니다인용되지 않음확장은 이 시점에서 파일 이름 생성의 영향 을 $file2
받지만 echo ${file2#*[_ ]}
사실상 .echo ${'*R1*'#*[_ ]}
echo *R1*
언제 큰따옴표가 필요합니까?.
ksh/bash/zsh에서 사용할 수 있습니다대량으로할당 - 종종 *R1*
여러 파일 이름이 생성될 수 있으므로 이 작업을 수행해야 합니다. 예를 들어 Bash에서는 다음과 같습니다.
shopt -s nullglob
file2=(*R1*)
echo "${file2[@]#*_}"