web-dev-qa-db-fra.com

remplacer une chaîne par variable dans un fichier à l'aide du script bash

à travers le script bash, j'essaie de trouver un numéro de valeur à partir d'un texte dans un fichier, puis crée une nouvelle variable, puis la remplace par une chaîne dans ce fichier, par exemple. dans un fichier dans /root/test.txt, j'ai une chaîne web1, il faut couper le nombre "1" et l'augmenter de 1 pour qu'il soit 2 puis remplacer web1 par web2, c'est ce que j'ai fait jusqu'à présent comment le faire fonctionner?

#!/bin/bash
m=grep 'web' /root/test.txt | awk '{print $2}'
i= $m | cut -c3
i=i+1
n='web$i'
$ sed -i 's/$m/$n/g' /root/test.txt

Exemple de saisie:

 project web0

Exemple de sortie:

 project web1
3
Adam

AWK peut également rechercher et remplacer du texte. Il n'est donc pas nécessaire d'utiliser grep ou sed. Le code ci-dessous extrait la sous-chaîne de la deuxième colonne (webN), incrémente N et remplace le deuxième champ par webN+1

$ cat testInput.txt                                                                                          
project web0
other
project web1
$ awk '/web/{ num=substr($2,4)+1;$2="web"num };1' testInput.txt                                              
project web1
other
project web2

Cela imprimera le fichier édité à l'écran. Vous pouvez enregistrer cela dans un autre fichier, tel que so awk [rest of code here] > fileName.txt et remplacer l’original par new en utilisant mv fileName.txt oldFile.txt.

3
Sergiy Kolodyazhnyy

Utiliser Perl:

Perl -pe 's/\bweb\K[0-9]+\b/$&+1/ge' file

Pour éditer le fichier en place, ajoutez l’option -i:

Perl -i -pe 's/\bweb\K[0-9]+\b/$&+1/ge' file
  • -p: Perl assume la boucle suivante autour de votre programme, ce qui le rend itératif sur les arguments de nom de fichier un peu comme sed:

       LINE:
         while (<>) {
             ...             # your program goes here
         } continue {
             print or die "-p destination: $!\n";
         }
    
  • -e: peut être utilisé pour entrer une ligne de programme.
  • s/\bweb\K[0-9]+\b/$&+1/ge: correspond à n'importe quelle chaîne web précédée d'une limite de mot, ignore la correspondance et correspond à un ou plusieurs chiffres suivis d'une limite de mot, en remplaçant la correspondance par le nombre équivalent augmenté de 1.
% cat file
project web0
project web1
project web2
% Perl -pe 's/\bweb\K[0-9]+\b/$&+1/ge' file
project web1
project web2
project web3
3
kos

Merci les gars, j'ai essayé ce code et cela a bien fonctionné pour moi,

#!/bin/bash
DPATH="/root/test.txt"
k=$(grep 'web' $DPATH | awk '{print $2}')      # web ends by a number#
i=$(grep 'web' $DPATH | awk '{print $2}'| cut -c3)
m=$((i+1))
n="web$m"
sed -i -e 's/'"$k"'/'"$n"'/g' $DPATH
1
Adam