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
4 Réponses :
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
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:" * code> devrait résoudre ce problème. J'ai édité la réponse.
Récemment, j'ai commencé à faire cela avec des emplois similaires:
: 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
[...]
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 : code> pour la simplicité, mais avec ex.
\ x01 code> Vous pouvez obtenir assez en sécurité. Ensuite, vous devriez changer le
S /:.*/// ; code> et
s / [^:] *: // code> commandes.
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
Ceci pourrait fonctionner pour vous (GNU SED):
printf ": %s\n" "${addr[@]}" | sed '/address:/R /dev/stdin' ymlFile | sed '/address:/{N;s/:.*:/:/}'