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/:.*:/:/}'