Bash - Regulärer Ausdruck zum Abgleichen von Zahlentupeln

Bash - Regulärer Ausdruck zum Abgleichen von Zahlentupeln

Ich möchte prüfen, ob ein String, der über den Befehl read in eine Variable in bash geschrieben wurde, ein Tupel aus zwei Zahlen ist. Meines Wissens sollte dies möglich sein mit

if [[ "$input" =~ "$regex" ]]; then ...

für ein Tupel aus zwei Zahlen, getrennt durch mindestens ein Leerzeichen und eine beliebige Anzahl von Leerzeichen davor und danach, habe ich versucht

$regex="^ *[0-9]+ +[0-9]+ *$"

das sollte übereinstimmen

12 123
  23 3246543
123     345     
     34      23
1 234

aber nicht

123 123 123
1235124
123w123 123
etc.

das funktioniert jedoch nicht...

Antwort1

POSIXShell-Skriptfunktion, verwendet Parametererweiterung, um die erste und zweite Zahl zu erhalten, -eqist nur erfolgreich, wenn es zwei Argumente gibt, die beide dieselbe Zahl sind (und schlägt fehl, wenn es weniger oder mehr Argumente gibt oder wenn eines davon Buchstaben enthält) und !=prüft auf ein Leerzeichen. Gibt zurückWAHRnur wenn es ein Zwei-Zahlen-Tupel ist:

is_tup() { [ ${1% *} -eq ${1% *} -a \ 
             ${1#* } -eq ${1#* } -a "${1% *}" != "$1" ] 2> /dev/null ; }

Prüfen:

echo '12 123
  23 3246543
123     345     
     34      23
1 234
123 123 123
1235124
123w123 123' | 
while read x ; do is_tup "$x" && a=yes || a=no ; printf '%s\t%s\n' $a "$x" ; done

Ausgabe:

yes 12 123
yes 23 3246543
yes 123     345
yes 34      23
yes 1 234
no  123 123 123
no  1235124
no  123w123 123

verwandte Informationen