파일 이름에서 숫자 추출

파일 이름에서 숫자 추출

이 모델을 따르는 파일 이름이 있습니다.

 1.raw_bank_details_211.trg
 2.raw_bank_details_222.trg

유닉스에서 명령을 사용 cut하고 위의 문자열을 잘라내어 문자열에서 및 211 값을 가져와 값을 에코해야 합니다.222

grep을 사용했는데 grep -o -E '[0-9]+'대안이 필요합니다.

답변1

.cut

다음은 몇 가지 방법입니다.


두 번째 필드를 사용하거나 awk가져오거나 _분리 합니다..

awk -F '[_.]' '{print $(NF-1)}' file.txt

grepPCRE( -P) 사용:

grep -Po '\d+(?=[^_]*$)' file.txt
  • -o일치하는 부분만 가져오기

  • \d+하나 이상의 숫자 일치

  • 너비가 0인 긍정적인 미리보기는 라인 끝까지 후속 조치를 (?=[^_]*$)보장하지 않습니다._


그리고 sed:

sed -E 's/.*_([[:digit:]]+).*/\1/' file.txt
  • .*_결국 다 일치함_

  • ([[:digit:]]+)필요한 숫자를 일치시켜 캡처 그룹에 넣습니다.

  • .*나머지도 일치시키세요

  • 교체시에는 \1캡처된 그룹만 사용되며,


의 경우 다음 perl과 동일한 논리입니다 sed.

perl -pe 's/.*_(\d+).*/$1/' file.txt 

반드시 사용해야 하는 경우 cut두 단계로 수행하십시오. 먼저 _분리된 네 번째 필드를 가져온 다음 .분리된 첫 번째 필드를 가져옵니다.

cut -d_ -f4 file.txt | cut -d. -f1

필드 번호를 하드코딩해야 하므로 권장되지 않습니다.


문자열이라면 쉘 매개변수 확장을 사용하여 수행합니다.

% str='1.raw_bank_details_211.trg'

% str=${str##*_} 

% echo "${str%%.*}"
211

여전히 while구문을 사용하고 각 줄을 변수에 넣어 그렇게 할 수 있지만 대용량 파일에서는 속도가 느려집니다. 또는 필요한 경우 _.as를 사용하여 하드코딩된 필드(예: )를 가져올 수도 있습니다 .IFScut


예:

% cat file.txt                          
1.raw_bank_details_211.trg
2.raw_bank_details_222.trg

% awk -F '[_.]' '{print $(NF-1)}' file.txt
211
222

% grep -Po '\d+(?=[^_]*$)' file.txt         
211
222

% sed -E 's/.*_([[:digit:]]+).*/\1/' file.txt
211
222

% perl -pe 's/.*_(\d+).*/$1/' file.txt 
211
222

% cut -d_ -f4 file.txt | cut -d. -f1
211
222

답변2

cut잘못된 도구입니다. 짧은 문자열(예: 파일 이름)을 조작하려면 가능하면 쉘의 문자열 조작 기능을 사용하십시오. 모든 sh 유형 쉘 1(sh, dash, bash, ksh, zsh 등)에는 변수 대체의 일부로 기본적인 문자열 조작이 있습니다. 예를 들어 참조하십시오.대시보드 매뉴얼"매개변수 확장"에서. 패턴과 일치하는 가장 짧은/가장 긴 접두사/접미사를 제거할 수 있습니다.

파일 이름의 마지막 숫자 시퀀스를 원하므로 다음과 같습니다.

  1. 마지막 숫자 앞의 모든 항목을 제거하여 숫자가 아닌 접미사를 확인합니다.
  2. 이 접미사를 제거하세요.
  3. 숫자가 아닌 마지막 항목까지 모두 제거합니다.
filename=1.raw_bank_details_211.trg
suffix="${filename##*[0-9]}"
number="${filename%"$suffix"}"
number="${number##*[!-0-9]}"

¹POSIX 이전 Bourne 쉘을 제외 하고는 신경 쓰지 않아도 됩니다.

관련 정보