文字列で最長の数字を印刷するには?

文字列で最長の数字を印刷するには?

私は文字列で最長の数字を印刷する方法を探しています。

例: 文字列がある場合

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

おすすめ記事