중간에 파일 이름의 일부를 인쇄하십시오.

중간에 파일 이름의 일부를 인쇄하십시오.

다음과 같은 이름의 파일이 여러 개 있습니다.

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

관련 정보