이 모델을 따르는 파일 이름이 있습니다.
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
grep
PCRE( -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를 사용하여 하드코딩된 필드(예: )를 가져올 수도 있습니다 .IFS
cut
예:
% 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 등)에는 변수 대체의 일부로 기본적인 문자열 조작이 있습니다. 예를 들어 참조하십시오.대시보드 매뉴얼"매개변수 확장"에서. 패턴과 일치하는 가장 짧은/가장 긴 접두사/접미사를 제거할 수 있습니다.
파일 이름의 마지막 숫자 시퀀스를 원하므로 다음과 같습니다.
- 마지막 숫자 앞의 모든 항목을 제거하여 숫자가 아닌 접미사를 확인합니다.
- 이 접미사를 제거하세요.
- 숫자가 아닌 마지막 항목까지 모두 제거합니다.
filename=1.raw_bank_details_211.trg
suffix="${filename##*[0-9]}"
number="${filename%"$suffix"}"
number="${number##*[!-0-9]}"
¹POSIX 이전 Bourne 쉘을 제외 하고는 신경 쓰지 않아도 됩니다.