난 그냥이 할 수 있다고 생각 grep
, sort
그리고 tail
뿐만 아니라. 다음은 문자열 예입니다.
$ echo <str> | grep -oP "\d+" | sort -n | tail -1
<str>
우리의 끈은 어디에 있습니까 ?
예
$ set -o posix; set | grep "str[0-9]"
str0=212334123434test233
str1=212334123434test233abc44
str2=233test212334123434
str3=a212334123434test233abc44
str4=a91234b212334123434abc
이제 grep ...
명령을 통해 차례로 실행하면
$ echo $str0 | grep -oP "\d+" | sort -n | tail -1
212334123434
$ echo $str1 | grep -oP "\d+" | sort -n | tail -1
212334123434
$ echo $str2 | grep -oP "\d+" | sort -n | tail -1
212334123434
$ echo $str3 | grep -oP "\d+" | sort -n | tail -1
212334123434
$ echo $str4 | grep -oP "\d+" | sort -n | tail -1
212334123434
이 방법은 일련의 숫자 인 하위 문자열을 모두 선택하여 작동합니다. 그런 다음이 출력을 숫자로 정렬 sort -n
한 다음을 사용하여 목록의 마지막 값을 가져옵니다 tail -1
. 가장 긴 부분 문자열이됩니다.
tail -1
예제 중 하나를 해제하고 다시 실행 하여 작동 방식을 확인할 수 있습니다 .
$ echo $str4 | grep -oP "\d+" | sort -n
91234
212334123434
0으로 시작하는 문자열
위의 접근 방식은 하나를 제외하고 생각할 수있는 모든 상황에 적용됩니다. @terdon 은 위의 접근법을 방해 하는이 시나리오를 채팅에서 언급했습니다 .
따라서이 문제를 해결하려면 전술을 약간 변경해야합니다. 위의 접근 방식의 커널은 여전히 활용할 수 있지만 결과에 문자 수를 주입해야합니다. 이렇게하면 문자열의 문자 수와 값으로 결과를 정렬 할 수 있습니다.
$ for i in $(echo $str0 | grep -oP "\d+");do a=$(echo "$i" | wc -c); \
echo "$a $i"; done | sort -n | tail -1 | cut -d" " -f2
결과 :
$ echo $str0
0000000000001a2test
$ for i in $(echo $str0 | grep -oP "\d+");do a=$(echo "$i" | wc -c); \
echo "$a $i"; done | sort -n | tail -1 | cut -d" " -f2
0000000000001
를 사용하여 변수의 길이를 결정하는 Bash 기능을 사용하여 이것을 약간 압축 할 수 있습니다 ${#var}
.
$ for i in $(echo $str0 | grep -oP "\d+");do echo "${#i} $i"; done | \
sort -n | tail -1 | cut -d" " -f2
0000000000001
`grep -P 사용하기
내가 사용하기로 선택했습니다 grep -P ...
: 모든 숫자가 너무 좋아하는 말의 클래스 구문처럼 펄 개발자가되고, 내가 있기 때문에 위의 \d+
대신에, [[:digit:]]\+
또는 [0-9]\+
. 그러나이 특별한 문제에는 실제로 필요하지 않습니다. grep
내가 사용한 것처럼 쉽게 교체 할 수 있습니다 .
$ .... grep -o "[0-9]\+" ....
예를 들면 다음과 같습니다.
$ for i in $(echo $str0 | grep -o "[0-9]\+");do echo "${#i} $i"; done | \
sort -n | tail -1 | cut -d" " -f2
0000000000001