Frage

Ich möchte ein Shell schreiben (AWK, Sed auch fein) Programm als Eingabe eine Textzeile zu übernehmen.

Welche willkürlich integer Saiten in ihm ausgebreitet haben wird. z

"12884 und 111933 sind zwei Zahlen und 323232 ist auch eine Reihe"

Ich möchte die Ausgabe sein

„12.884 und 1,11,933 sind zwei Zahlen und 2,23,232 ist auch eine Reihe“

Wenn diese PHP ein einfaches preg_replace_callback ist hätte den Zweck erfüllt, aber ich möchte dies in der Schale sein. : /

Alle Hinweise wäre eine große Hilfe.

War es hilfreich?

Lösung

Es ist nicht notwendig, die Linie mit tr aufzuspalten. Sie können Bashs Wort Splitting-Funktion machen:

line="12884 and 111933 are two numbers and 323232 is also a number"
for word in $line
do
    if [[ $word = *[^0-9]* ]]
    then
        printf "%s " $word
    else
        printf "%'d " $word
    fi
done

Ich habe auch Globbing zu Test für eine Folge von Ziffern verwendet, anstatt sich auf etwas, das einen Fehler oder nicht, je nachdem, erstellt ob es eine ganze Zahl ist.

Andere Tipps

for line in $(echo "12884 and 111933 are two numbers and 323232 is also a number" 
    | tr ' ' '\n');
    do 
        if [ $line -eq $line 2> /dev/null ]; 
            then printf "%'d\n" $line;
        else 
            echo $line; 
        fi; 
    done | tr '\n' ' '

Ich verstehe das lang sein kann und hässlich, aber jetzt ist das Beste, was ich tun konnte, ich hoffe, es wird helfen.

Folgt die Erklärung:

  • Faust I spaltete die Linie auf mehr Linien so kann ich Schleife und erkennen, welche Strings Anzahl und welche nicht
  • ich dann testen, ob der aktuelle String eine Zahl
  • , wenn es sich um eine Zahl, die ich Parse mit der Verwendung von printf
  • wenn es nicht ich einfach echo es, so dass, wie es war
  • beenden Sie die Schleife und legte alles zurück auf eine Zeile
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top