Je dois remplacer un gros bloc de texte (code de script shell) dans un fichier par un autre bloc de texte.
Je suis impressionné par le Comment puis-je utiliser sed pour remplacer une chaîne multiligne ? répondu par
antak et Multi-line replace répondu par Bruce Ediger
Mais j'ai du mal à les utiliser.
-
antak a déjà mentionné dans sa réponse que le fichier entier était diffusé en continu (
1h;2,$H;$!d;g;
) au tampon n'est pas conseillé pour les fichiers volumineux, car il surcharge la mémoire. -
Je connais
sed
peut être utilisé avec la fonction de bloc pour conserver le texte en dehors du bloc inchangé. Je veux utiliser cette fonctionnalité. Mais si j'utilise,sed -i '/marker1/,/marker2/s/.*/new text (code)/' filename
il insérera un nouveau texte (code) à plusieurs reprises pour chaque flux. Par conséquent, je dois créer le bloc visuel en un seul flux, en utilisant quelque chose de similaire à ce qui a été suggéré par antak plus tôt, mais pour le bloc (pas pour le fichier entier).
-
Comme mentionné par Bruce Ediger ajouter la fonctionnalité de
ex
qui commencent para
se termine par.
(point) peut être essayé, mais mon nouveau texte (code) contient des lignes commençant par un point, qui peut être considéré comme le point de la syntaxe d'ajout. Comment puis-je l'utiliser dans cette situation ? -
ex
estdd
'nombre de lignes' peut supprimer plusieurs lignes, mais si j'ai un bloc entre /marker1/ et /marker2/ avec le nombre de lignes non fixé (variant) doit être remplacé par un nouveau texte (code), comment faire ?
Réponse acceptée :
Je suggère d'utiliser le c commande hange
(qui est essentiellement un d elete couplé avec un a ppend, bien que l'ajout ne soit appliqué que pour la dernière ligne de la plage, ce qui correspond exactement à ce que vous voulez ici) :
sed -i '/marker1/,/marker2/c
New text 1
New text 2' filename
Ici en utilisant GNU sed
la syntaxe de l'édition sur place (-i
). Ce c
la commande est par ailleurs standard et portable. GNU sed
prend en charge :
sed '/marker1/,/marker2/cNew text 1
New text 2' filename
en tant qu'extension non standard.
Les caractères de saut de ligne et de barre oblique inverse doivent être échappés (avec une barre oblique inverse) dans le texte de remplacement.