Je dois apporter des modifications à un fichier, mais je veux faire correspondre plusieurs lignes.
J'ai essayé quelque chose comme sed 's / name-here \ n. * version:. * / name-here \ nversion : new-version / g 'file.yaml
mais ne fonctionne pas
Ceci est une paix de code du fichier
name_here: - name: name-here version: new-version - name: other-name version: 1.3.2.115 - name: final-name version: 1.3.2.115
Après J'utiliserai sed Je veux finir avec quelque chose comme:
name_here: - name: name-here version: 1.3.2.115 - name: other-name version: 1.3.2.115 - name: final-name version: 1.3.2.115
4 Réponses :
En raison de la structure des données, vous pouvez les contourner en utilisant une plage d'expressions régulières plutôt que d'essayer de faire des choses sur plusieurs lignes dans sed
. Vous devriez vraiment le faire avec un outil YAML approprié.
Essayez
$ sed '/- name: name-here/,/ version:/s/version: .*/version: new-version/' <<END name_here: - name: name-here version: 1.3.2.115 - name: other-name version: 1.3.2.115 - name: final-name version: 1.3.2.115 END name_here: - name: name-here version: new-version - name: other-name version: 1.3.2.115 - name: final-name version: 1.3.2.115
C'est une tâche facile pour awk
awk 'f && /version/ {sub(/: .*/, ": new version");f=0} /name-here/ {f=1} 1' file name_here: - name: name-here version: new version - name: other-name version: 1.3.2.115 - name: final-name version: 1.3.2.115
Si le formatage est important, cela devrait faire:
awk 'f && /version/ {$2="new version";f=0} /name-here/ {f=1} 1'file name_here: - name: name-here version: new version - name: other-name version: 1.3.2.115 - name: final-name version: 1.3.2.115
Avec GNU sed:
name_here: - name: name-here version: new-version - name: other-name version: 1.3.2.115 - name: final-name version: 1.3.2.115
Sortie:
sed -r '/- name: name-here$/{n; s/(version: ).*/\1new-version/ }' file
Voir: man sed
Cela pourrait fonctionner pour vous (GNU sed):
sed '/name-here/{:a;n;/version:/s/:.*/: new-version/;Ta;:b;n;bb}' file
Recherchez une ligne contenant nom-ici
, puis modifiez la première ligne contenant version :
.
Si vous ne souhaitez remplacer la version:
qu'une fois dans un fichier, utilisez:
sed '/name-here/{:a;n;/version:/s/:.*/: new-version/;Ta}' file
p>
awk est meilleur pour ce travail. Le sed est-il obligatoire?