문자열에서 가장 긴 숫자를 인쇄하는 방법을 찾고 있습니다.
예: 문자열이 있는 경우
212334123434test233
어떻게 인쇄할 수 있어?
212334123434
?
참고: 수치적으로 더 높은 값이 아닌 가장 긴 연속 숫자 시퀀스를 찾고 있습니다.
편집하다:답변해 주셔서 감사합니다. 이 질문에 대한 반응은 매우 뜨거웠습니다. @HaukeLaging의 게시물이 내 특정 상황에 매우 잘 맞기 때문에 허용되는 답변으로 표시하고 있지만 모든 답변이 동일하게 유효하다는 점을 지적하고 싶습니다. 문제를 해결하기 위해 몇 가지 다른 옵션을 갖는 것은 항상 좋은 일입니다.
답변1
나는 당신이 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이 채팅에서 언급했습니다.이 상황은 위의 접근 방식을 무효화합니다.
- 0000000000001
- 2
따라서 이 문제를 해결하려면 전략을 조금 바꿔야 합니다. 위 방법의 핵심은 여전히 악용될 수 있지만 결과에 문자 수를 삽입해야 합니다. 이를 통해 문자열의 문자 수와 해당 값을 기준으로 결과를 정렬할 수 있습니다.
$ 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 ...
나는 Perl 개발자로서 모든 숫자를 또는 \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
답변2
해결책 perl
:
echo 212334123434test233abc44 |
perl -nle 'print ((
map { $_->[0] }
sort{ $a->[1] <=> $b->[1] }
map { [$_,length] }
split /\D+/, $_)[-1]
)'
212334123434
인용하다
답변3
echo 212334123434test233abc44 |
awk '{gsub("[^0-9]+","\n"); print;}' |
awk '{ if (length($0) > max) {max = length($0); maxline = $0} }
END { print maxline }'
212334123434
답변4
소수와 정수를 처리할 수 있는 또 다른 Perl 메서드는 다음과 같습니다.
echo "0.212334123434test233" |
perl -lne 'while(/([\d.]+)/g){$max=$1 if length($1) > length($max)} print $max'
지금까지 게시된 답변 중 소수를 처리하는 답변은 없으며 수치상 가장 큰 숫자가 아닌 가장 긴 숫자를 원한다고 지정했기 때문에 실제로필요소수점.
설명하다
perl -lne
:-n
"입력을 한 줄씩 읽고-e
그에 대해 주어진 스크립트를 실행한다"는 의미입니다. 각 호출에-l
줄바꿈을 추가합니다print
(여기서 관련되지 않은 다른 항목도 포함).while(/([\d.]+)/g)
: 모든 숫자에 대해 반복합니다( 즉, 숫자의 합이 일치함을 의미)\d
. 음수도 찾으려면 다음 단계에서 사용할 일치하는 문자열을 추가하세요 .[0-9]
[\d.]
.
-
$1
$max=$1 if length($1) > length($max)
: 현재 일치 항목의 길이가 지금까지 가장 긴 것($max
)보다 긴 경우 일치 항목을 로 저장합니다$max
.print $max
:발견된 가장 긴 숫자 문자열을 인쇄합니다. 이것이 실행될 것이다뒤쪽에while 루프가 종료되므로 모든 숫자를 찾은 후입니다.