
이 모델을 따르는 파일 이름이 있습니다.
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
두 단계로 수행합니다. 먼저 _
분리된 4번째 필드를 가져온 다음 .
분리된 첫 번째 필드를 가져옵니다.
cut -d_ -f4 file.txt | cut -d. -f1
필드 번호를 하드코딩해야 하므로 이는 권장되지 않습니다.
문자열이라면 쉘 매개변수 확장을 사용하여 수행할 것입니다.
% str='1.raw_bank_details_211.trg'
% str=${str##*_}
% echo "${str%%.*}"
211
여전히 while
구문을 사용하고 각 줄을 변수로 가져와 이를 수행할 수 있지만 대용량 파일의 경우 속도가 느려집니다. 또한 원하는 경우 대신 _.
로 사용하여 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 쉘을 제외하고는 신경 쓰지 않습니다.