0
votes

Bash: Remplacez chaque occurrence de la chaîne dans le fichier avec la valeur suivante du tableau

J'ai un fichier .yml avec trois entrées d'adresse et d'autres données, et une matrice contenant trois nouvelles adresses pour les remplacer avec

File.yml: P>

  - address: s1.example.com
  - address: w1.example.com
  - address: w2.example.com
sed: no input files


0 commentaires

4 Réponses :


0
votes

Une solution possible est la suivante:

addr=(storage.domain.com worker1.domain.com worker2.domain.com)
i=0
line_count=1
while IFS= read -r line; do
    if [[ $line == *"- address:"* ]]; then
      sed -i "${line_count}s/- address: .*/- address: ${addr[i]}/" file.yml
      i=$((i+1))
    fi
    line_count=$((line_count+1))
done < file.yml


5 commentaires

Cela semble avoir effacé chaque adresse, mais le premier, qui a été réglé sur travailleur2.domain.com


Non, attends, j'ai trouvé le problème. Il y avait un commentaire au-dessus des valeurs qui ont également eu le texte "adresse" dedans


@Jabbl Je l'ai testé et a travaillé pour l'exemple d'entrée. Pourriez-vous me dire quel problème avez-vous rencontré?


Un commentaire juste au-dessus de mon échantillon a dit ceci: '# Ajouter "Internal_address: x" # Lorsque vous changez "adresse" sur externe. «En raison de la recherche via la recherche dans votre exemple, ces deux ont également été incluses.


Changer le caractère générique sur * "- adresse:" * devrait résoudre ce problème. J'ai édité la réponse.



0
votes

Récemment, j'ai commencé à faire cela avec des emplois similaires:

  • Imprimez tous les membres de la matrice avec un séparateur, ex. : code>. Placez ceci comme première entrée sur sed code>. Li>
  • La première ligne (c.-à-d. Les membres de la matrice imprimés avec un séparateur) sont mis dans l'espace de maintien li>
  • puis pour chaque - adresse: code> trouvé:
    • Je copie l'espace de maintien dans l'espace motivé, extrayez le premier élément du tableau et appendez-le avec - adresse: code>. Et imprimer. Li>
    • et retirez le premier élément de l'espace de maintien li> ul> li> ul>

      Le script ci-dessous: p>

      [...]
      - address: storage.domain.com
        user: ubuntu
        role: storage
      - address: worker1.domain.com
        user: ubuntu
        role: worker
      - address: worker2.domain.com
        user: ubuntu
        role: worker
      [...]
      


2 commentaires

Pour moi, cela semble que cela évolue vraiment lorsque vous ajoutez plus d'entrées au tableau et au fichier. Est-ce correct?


Ce serait correct, je suppose que c'est tout le point. Il faut prendre soin de choisir le séparateur de tableau. J'ai juste choisi : pour la simplicité, mais avec ex. \ x01 Vous pouvez obtenir assez en sécurité. Ensuite, vous devriez changer le S /:.*/// ; et s / [^:] *: // commandes.



0
votes
addr[0]="storage.domain.com"
addr[1]="worker1.domain.com"
addr[2]="worker2.domain.com"

gawk -i inplace -F: -v addr="${addr[*]}" ' BEGIN{count=0 ; split(addr, addr_array, " ") }
{
    if( $1 ~ /address/ ) {

        for(i=1;i<=NF-1;++i){
            printf "%s:", $i
        }

        printf "%s\n", addr_array[++count]
    }
    else
    {
        print
    }

}' file.yml

0 commentaires

0
votes

Ceci pourrait fonctionner pour vous (GNU SED):

printf ": %s\n" "${addr[@]}" |
sed '/address:/R /dev/stdin' ymlFile | 
sed '/address:/{N;s/:.*:/:/}'


0 commentaires