Question

Je veux écrire un programme Shell (AWK, Sed aussi bien) prendre comme entrée une seule ligne de texte.

Ce qui se sont propagées arbitrairement des chaînes entières en elle. par exemple

"12884 et 111933 sont deux nombres et 323232 est également un certain nombre"

Je veux que la sortie soit

« 12884 et 1,11,933 sont deux nombres et 2,23,232 est également un certain nombre »

Si tel était PHP simple preg_replace_callback aurait servi le but, mais je veux que ce soit dans la coquille. : /

Les pointeurs serait d'une grande aide.

Était-ce utile?

La solution

Il est pas nécessaire de diviser la ligne en utilisant tr. Vous pouvez utiliser la fonction de partage de mot de Bash:

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

Je l'ai aussi utilisé englobement pour tester une séquence de chiffres plutôt que de compter sur quelque chose qui crée une erreur ou non selon que ce soit un entier.

Autres conseils

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' ' '

Je comprends cela peut être long et laid, mais maintenant est le meilleur que je pouvais faire, je l'espère vous aidera.

Suit l'explication:

  • poing je partage la ligne sur plusieurs lignes en boucle afin que je puisse reconnaître et quelles chaînes sont le nombre et qui ne sont pas
  • je teste si la chaîne en cours est un nombre
  • si elle est un numéro que je parse avec l'utilisation de printf
  • si ce n'est pas moi simplement l'écho, laissant comme il était
  • terminer la boucle et tout remettre sur une ligne
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top