2
votes

Comment changer un texte, avec sed, lorsque vous souhaitez faire correspondre plusieurs lignes

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

sed

1 commentaires

awk est meilleur pour ce travail. Le sed est-il obligatoire?


4 Réponses :


3
votes

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


0 commentaires

1
votes

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


0 commentaires

0
votes

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


0 commentaires

0
votes

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>


0 commentaires