2017-10-11 3 views
1

JeShell: Comment incrémenter premier entier se produisant dans une variable

$string1=\-9-0 ---> $increment1=\-10-0 
$string2=\-99 ----> $increment2=\-100 
$string3=\-999-0-4 --> $increment3=\-1000-0-4 

J'incrémentiez juste le premier entier se produisant à une valeur et entiers sont préfixées avec -

+0

pourquoi est une chaîne changé pour augmenter? et vous devriez aussi poster ce que vous avez essayé de résoudre ceci ... – Sundeep

+0

Juste essayé de différencier comment la chaîne incrémentée ressemblera à un exemple. Je n'ai pas résolu cela en cherchant de l'aide pour obtenir cette solution –

+0

vous devez mieux formater la question, mettre l'entrée et la sortie dans deux blocs de code séparés ... changer seulement les choses que vous devez changer ... et ce forum est à propos de obtenir de l'aide sur le code que vous avez essayé mais n'a pas fonctionné .. pas sur l'obtention du code entier ... – Sundeep

Répondre

1

En utilisant awk

awk 'BEGIN{FS=OFS="-"} {$2=$2+1; print}' <<<$string1 

Explication:

Nous avons défini le séparateur de champ/délimiteur i.e FS comme -, donc dans la chaîne -9-0 le deuxième champ serait 9.
Nous incrémentons ensuite $2 par 1. Aussi OFS=- de sorte que lorsque les champs sont imprimés - est inclus en tant que délimiteur sinon awk considère l'espace comme délimiteur par défaut.

Pour l'enregistrer sur la variable:

$ string1=$(awk 'BEGIN{FS=OFS="-"} {$2=$2+1;}1' <<<$string1) 

$ echo $string1 
-10-0 


$ string3=$(awk 'BEGIN{FS=OFS="-"} {$2=$2+1;}1' <<<$string3) 

$ echo $string3 
-1000-0-4 
+0

C'est ce dont j'ai besoin. Merci BATMAN pour le sauvetage :) –

+0

Pouvez-vous s'il vous plaît expliquer le code? –

+1

@AkhayHegde: Merci d'avoir mis à jour la réponse. – batMan

1

En utilisant awk:

One-liner:

awk 'BEGIN{FS=OFS="="}match($2,/[0-9]+/){sub(/[0-9]+/,substr($2,RSTART,RLENGTH)+1,$2)}1' infile 

ou même cela fonctionne pour l'échantillon d'entrée donné

awk -F'[^[:digit:]]+' '{t=$0; sub(/-[0-9]+/,"-"$3+1,t); print t }' infile 

Entrée:

$ cat infile 
$string1=\-9-0 
$string2=\-99 
$string3=\-999-0-4 

Sortie:

$ awk 'BEGIN{FS=OFS="="}match($2,/[0-9]+/){sub(/[0-9]+/,substr($2,RSTART,RLENGTH)+1,$2)}1' infile 
$string1=\-10-0 
$string2=\-100 
$string3=\-1000-0-4 

$ awk -F'[^[:digit:]]+' '{t=$0; sub(/-[0-9]+/,"-"$3+1,t); print t }' infile 
$string1=\-10-0 
$string2=\-100 
$string3=\-1000-0-4 

Mieux Lisible:

awk ' 
     BEGIN{ 
      FS=OFS="=" 
     } 
     match($2,/[0-9]+/){ 
      sub(/[0-9]+/,substr($2,RSTART,RLENGTH)+1,$2) 
     }1 
    ' infile 
+0

Bonne réponse, merci pour l'aide.Pouvons-nous faire la même chose à la place de l'entrée de fichier. Pouvons-nous faire écho "\ -9" | awk ..... devrait me donner \ -10. –

+0

Génial ... Merci –