Ich glaube , Sie können dies tun , mit nur grep
, sort
und tail
außerdem. Hier sind einige Beispielzeichenfolgen.
$ echo <str> | grep -oP "\d+" | sort -n | tail -1
Wo <str>
ist unsere Schnur in Frage.
Beispiel
$ set -o posix; set | grep "str[0-9]"
str0=212334123434test233
str1=212334123434test233abc44
str2=233test212334123434
str3=a212334123434test233abc44
str4=a91234b212334123434abc
Nun, wenn ich diese grep ...
nacheinander durch meinen Befehl laufen lasse.
$ 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
Bei diesem Ansatz werden alle Teilzeichenfolgen ausgewählt, bei denen es sich um Ziffernfolgen handelt. Wir sortieren diese Ausgabe dann numerisch sort -n
und greifen dann mit auf den letzten Wert in der Liste zu tail -1
. Dies ist der längste Teilstring.
Sie können sehen, wie es funktioniert, indem tail -1
Sie eines der Beispiele abnehmen und erneut ausführen:
$ echo $str4 | grep -oP "\d+" | sort -n
91234
212334123434
Zeichenfolgen, die mit Nullen beginnen
Der obige Ansatz funktioniert für jede Situation, die ich mir vorstellen kann, außer für eine. @terdon erwähnte im Chat dieses Szenario, das den obigen Ansatz vereitelt.
Um damit fertig zu werden, müssen Sie die Taktik leicht ändern. Der Kernel des obigen Ansatzes kann weiterhin genutzt werden, wir müssen jedoch auch die Anzahl der Zeichen in die Ergebnisse einfügen. Dies gibt sort die Möglichkeit, die Ergebnisse nach Anzahl der Zeichen in den Zeichenfolgen und deren Werten zu sortieren.
$ 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
Ergebnisse:
$ 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
Sie können dies ein wenig komprimieren, indem Sie die Fähigkeit von Bash nutzen, die Länge einer Variablen mithilfe von zu bestimmen ${#var}
.
$ for i in $(echo $str0 | grep -oP "\d+");do echo "${#i} $i"; done | \
sort -n | tail -1 | cut -d" " -f2
0000000000001
Mit `grep -P
Ich habe mich für die grep -P ...
obige Verwendung entschieden, weil ich als Perl-Entwickler die Klassensyntax mag, alle Ziffern so zu sagen : \d+
, anstelle von [[:digit:]]\+
oder [0-9]\+
. Aber für dieses spezielle Problem wird es nicht wirklich benötigt. Sie können das, was grep
ich verwendet habe, genauso gut austauschen :
$ .... grep -o "[0-9]\+" ....
Beispielsweise:
$ for i in $(echo $str0 | grep -o "[0-9]\+");do echo "${#i} $i"; done | \
sort -n | tail -1 | cut -d" " -f2
0000000000001