다음과 같은 이름의 파일이 여러 개 있습니다.
ID_Italy.txt
ID2_USA.txt
ID3_Germany.txt
.....
_ 이전에 인쇄하고 싶다면 다음과 같이 할 수 있습니다.
for file in *.txt; do print "${file%_*}";done
산출:
ID
ID2
ID3
확장자를 인쇄하고 제거하려면 다음을 수행하십시오.
for file in *.txt; do print "${file%.*}";done
산출:
ID_Italy
ID2_USA
ID3_Germany
그러나 나는 단지 _ 와 사이의 어떤 것을 취하고 싶습니다. 다음과 같은 결과가 출력됩니다.
Italy
USA
Germany
어떻게 인쇄하나요?
답변1
편집 후에는 임시 변수가 없습니다.
$ for file in *.txt; do echo "${file//?(.*|*_)/}";done
USA
Germany
Italy
답변2
Bash(중첩 매개변수 대체 지원)와 다른 버전의 zsh를 사용하는 경우 다음을 수행할 수 있습니다.
for file in ./*.txt; do
print "${${file%.txt}#*_}"
done
또는 Bash에서 배열 솔루션을 사용하십시오.
for file in ./*.txt; do
{ IFS='_.' arr=( $file ); printf "%s\n" "${arr[2]}"; }
done
답변3
#!/bin/bash
for f in *.txt ; do
f="${f%.*}"
echo ${f##*_}
done
명령을 사용하여 파일을 만든 touch
다음 fx
스크립트를 실행했습니다.
$ touch ID_Italy.txt
$ touch ID2_USA.txt
$ touch ID3_Germany.txt
$./fx
USA
Germany
Italy
답변4
bash
:
for f in ID[0-9_]*[A-Za-z].txt
do
[[ "$f" =~ _([^.]+) ]] && printf "%s\n" "${BASH_REMATCH[1]}"
done
기준 POSIX
sh
:
for f in ID[0-9_]*[A-Za-z].txt
do IFS='_'; set -- $f; printf "%s\n" "${2%.*}"
done