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?