Étant donné un fichier avec un contenu comme celui-ci:

foo: 8.3.1
bar: 803001

J'ai besoin d'un script bash pour lire ce fichier seulement incrémenter le dernier chiffre et considérer les trois derniers chiffres de la deuxième ligne comme un espace pour que le z dans xyx passe à trois chiffres (et écrase le fichier d'origine avec le nouvelles données:

Entrée 1:

foo: 8.3.1
bar: 803001

Sortie 1:

 foo: 8.3.2
 bar: 803002

Entrée 2:

foo: 8.3.9
bar: 803009

Sortie 2:

 foo: 8.3.10
 bar: 803010

Entrée 3:

foo: 8.3.199
bar: 803199

Résultat 3:

 foo: 8.3.200
 bar: 803200

Je pourrais le faire en 2 secondes en java mais je dois le faire dans un script shell ou je ferai face à des railleries sans fin de la part de l'équipe de construction.

À court d'un fractionnement de chaîne grossier, toute commande sep lisse serait d'une grande aide!

1
bsautner 19 avril 2017 à 23:17

3 réponses

Meilleure réponse

awk à la rescousse!

 awk -v d='.' '{n=split($2,v,d); 
                if (n>1) $2=v[1] d v[2] d v[3]+1; 
                else $2++}1' file

Selon ce qui est dans le fichier, vous devrez peut-être qualifier le remplacement avec une condition avant l'instruction.

7
karakfa 19 avril 2017 à 20:42

Faire du vélo et jouer légèrement au golf. Incrémentez le nombre formé par les chiffres en fin de ligne:

perl -i -pe '/^(foo|bar):/ && s/\d+$/$&+1/e;' input 
4
ilkkachu 19 avril 2017 à 22:27
while read key val _; do
  val_left="${val%.*}" val_right="${val##*.}"
  printf '%s ' "$key"
  [[ $val = *.* ]] && printf '%s.' "$val_left"
  printf '%d\n' $(( 1+val_right ))
done
4
kojiro 19 avril 2017 à 20:43