GNU/Linux >> Tutoriels Linux >  >> Linux

Comment utiliser Sed ou Ex pour remplacer un bloc (code multiligne) par un nouveau bloc de texte (code) ?

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.

  1. 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.

  2. 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).

  1. Comme mentionné par Bruce Ediger ajouter la fonctionnalité de ex qui commencent par a 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 ?

  2. ex est dd '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.


Linux
  1. Comment remplacer une chaîne dans un ou plusieurs fichiers ?

  2. Comment remplacer une chaîne par une chaîne contenant une barre oblique avec Sed ?

  3. Sed peut-il remplacer les caractères de nouvelle ligne ?

  4. Remplacer plusieurs textes de fichiers par Sed ?

  5. Comment utiliser sed pour modifier mes fichiers de configuration, avec des clés et des valeurs flexibles ?

Comment utiliser sed pour rechercher et remplacer une chaîne dans des fichiers

COMMENT UTILISER L'EDITEUR SED

Top 20 des commandes sed à utiliser

Comment utiliser Sed pour rechercher et remplacer une chaîne dans un fichier

Comment remplacer sed comme texte par python?

Comment remplacer les guillemets simples par un autre caractère dans sed ?