私は文字列で最長の数字を印刷する方法を探しています。
例: 文字列がある場合
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 で始まる文字列
上記の方法は、1つを除いて私が考えることができるすべての場合に機能します。@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
「入力を1行ずつ読み、-e
それに対して与えられたスクリプトを実行する」という意味です。各呼び出しに-l
改行を追加しますprint
(ここでは関連していない他の項目も含みます)。while(/([\d.]+)/g)
:すべての数字を繰り返します(つまり、数字の合計が一致することを意味します)\d
。負の数を見つけるには、次の手順で使用する一致する文字列を追加してください。[0-9]
[\d.]
.
-
$1
$max=$1 if length($1) > length($max)
:現在の一致の長さがこれまでで最も長いもの($max
)より長い場合は、一致をとして保存します$max
。print $max
:見つかった最も長い数値文字列を印刷します。これが実行されます後ろにwhileループが終了するので、すべての数字が見つかった後です。