Sed substitut à travers une phrase sur plusieurs lignes

11

Je suis novice dans l'utilisation de sed mais j'ai expérimenté sed s/..../..../(substitut) pour modifier une phrase complète si elle est sur une seule ligne mais je ne connais pas de solution alternative sur la façon de modifier une phrase qui peut avoir été séparée sur deux lignes telles que:

Cette:

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?

DᴀʀᴛʜVᴀᴅᴇʀ
la source
Great sed reference book: Definitive Guide to sed Tutorial and Reference by Daniel A. Goldman ISBN: 978-1-939824-01-1 (EPUB version) 08148804441822
Joe

Réponses:

16

La commande suivante fonctionnera dans les deux situations:

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

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

Radu Rădeanu
la source
3
@Gilles Je comprends vos bonnes intentions, mais s'il vous plaît essayer de tester avant de gâcher ma réponse. Mieux, si vous avez une autre opinion, est d'ajouter une autre réponse ou de laisser un commentaire.
Radu Radeanu
Bienvenue sur Stack Exchange. Ce site est édité en collaboration. Si vous n'êtes pas à l' aise avec l'idée de vos contributions en cours d' édition en collaboration par d' autres utilisateurs de confiance, cela ne peut être le site pour vous. J'ai remarqué que votre code a remplacé plus de l'expression spécifique qui était destiné, donc je la phrase édité.
Gilles de être le mal d'arrêt SO- '
@Gilles S'il vous plaît, vous n'avez pas besoin d'être espiègle. Vous remarquerez également que votre « code » remplacé absolument rien . Comme je l' ai dit, je comprends vos bonnes intentions. De mon exemple , je suppose que l'OP pour comprendre comment remplacer par une phrase sur plusieurs lignes avec sed, rien de plus. Telle est la question du titre. Le titre est pas perl.
Radu Radeanu
Non, le code que je posté fonctionne. (Sauf si Loremest sur la dernière ligne, un défaut qu'il partage avec votre version.)
Gilles de l' arrêt SO- méchants "
Cet exemple ne fonctionne pas quand il y a 3 ou plusieurs lignes de texte :(
artnikpro
12

Bien que sed peut correspondre à motifs sur plusieurs lignes ( en utilisant les commandes Nou Hpour ajouter des lignes successives correspondant avant), ceci est bien en dehors de sa zone de confort. Tentative que si vous aimez la douleur.

Perl peut faire ce genre de choses bien. Utilisez le -pbouton pour le faire traiter un enregistrement d'entrée standard à la fois et imprimer l'enregistrement modifié (à la Sed), et -000pour activer le mode paragraphe (où les enregistrements sont séparés par des lignes vides). Dans une expression régulière, \scorrespond à tout caractère des espaces dont 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 voulez mettre un saut de ligne dans le texte de remplacement lorsque l'original contient un, qui est plus compliqué. Comment faire cela dépend de vos besoins à l'endroit où placer la nouvelle ligne.

Gilles 'SO- arrête d'être méchant'
la source
@terdon Ah, je voulais permettre à plusieurs espaces mais il a oublié. Merci, fixe.
Gilles de être le mal d'arrêt SO- '
La question concerne sed. Il est également étiqueté avec sed, pas avec perl.
Radu Rădeanu
0

sed ne peut pas facilement lire sur plusieurs lignes. Utilisez perl -i -0pe 's/.../.../...'plutôt.

Faire
la source
7
sed peut lire sur plusieurs lignes!
Radu Rădeanu
3
@ RaduRădeanu Techniquement, oui. Mais cela en vaut rarement la peine.
Gilles 'SO- arrête d'être méchant'
3
@Gilles Si l'utilisation perlest plus simple pour vous, cela ne signifie pas que cela en sedvaut rarement la peine.
Radu Rădeanu