web-dev-qa-db-fra.com

Sed substitue par une phrase sur plusieurs lignes

Je suis novice dans l'utilisation de sed, mais j'expérimente le s/..../..../ (substitut) de sed pour modifier une phrase complète si elle se trouve sur une ligne, mais je ne connais pas de solution alternative pour modifier une phrase qui aurait pu être séparée sur deux lignes, par exemple:

Ce:

Lorem Ipsum is simply dummy text of the printing and typesetting industry.

est en fait écrit comme ceci:

Lorem Ipsum is simply dummy text of the 
printing and typesetting industry.

Comment pouvez-vous détecter cela ou le coder pour remplacer la phrase entière même si elle est sur deux lignes au lieu d'une?

11

La commande suivante fonctionnera dans les deux cas:

sed '/Lorem.*/ {N; s/Lorem.*industry\./string to replace/g}' filename

Plus d'explications: Comment puis-je utiliser sed pour remplacer une chaîne multiligne?

16
Radu Rădeanu

Bien que sed puisse faire correspondre des modèles sur plusieurs lignes (en utilisant les commandes N ou H pour ajouter des lignes successives avant la correspondance), cela se situe bien en dehors de sa zone de confort. Ne le tentez que si vous aimez la douleur.

Perl peut faire ce genre de choses bien. Utilisez le commutateur -p pour qu’il traite l’entrée standard un enregistrement à la fois et imprime l’enregistrement modifié (à la fin), et -000 pour activer le mode paragraphe (où sont séparés par des lignes vides). Dans une expression régulière, \s correspond à tout caractère d'espacement, y compris une nouvelle ligne.

Perl -p -000 -e 's/Lorem\s+Ipsum\s+is\s+simply\s+dummy\s+text\s+of\s+the\s+printing\s+and\s+typesetting\s+industry\./Replacement text/g'

Si vous souhaitez insérer une nouvelle ligne dans le texte de remplacement lorsque l'original en contient une, c'est plus compliqué. La procédure à suivre dépend de vos exigences quant à l'emplacement de la nouvelle ligne.

12
Gilles

sed ne peut pas facilement lire sur plusieurs lignes. Utilisez Perl -i -0pe 's/.../.../...' à la place.

0
To Do