Sed substituto através de uma frase em várias linhas

11

Eu sou novo no uso do sed, mas experimentei o sed s/..../..../(substituto) para modificar uma frase completa, se estiver em uma linha, mas não conheço uma solução alternativa sobre como modificar uma frase que pode ter sido separada em duas linhas, como:

Este:

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

é realmente escrito assim:

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

Como você pode detectar isso ou codificá-lo para substituir a frase inteira, mesmo que ela esteja em duas linhas, em vez de uma?

DᴀʀᴛʜVᴀᴅᴇʀ
fonte
Grande livro de referência sobre sed: guia definitivo para sed Tutorial e referência por Daniel A. Goldman ISBN: 978-1-939824-01-1 (versão EPUB) 08148804441822
Joe

Respostas:

16

O comando a seguir funcionará nas duas situações:

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

Mais explicações: Como posso usar o sed para substituir uma string de várias linhas?

Radu Rădeanu
fonte
3
@ Gilles, eu entendo suas boas intenções, mas tente testar antes para atrapalhar minha resposta. Melhor, se você tem outra opinião, é adicionar outra resposta ou deixar um comentário.
Radu Rădeanu
Bem-vindo ao Stack Exchange. Este site é editado em colaboração. Se você não se sentir confortável com a ideia de suas contribuições serem editadas em colaboração por outros usuários confiáveis, talvez este não seja o site para você. Notei que seu código substituiu mais do que a frase específica pretendida, então editei a frase em.
Gilles 'SO- stop be evil'
@ Gilles Por favor, você não precisa ser travesso. Você também deve observar que seu "código" não substituiu absolutamente nada . Como eu disse, eu entendo suas boas intenções. Do meu exemplo, suponho que o OP entenda como substituir uma sentença em várias linhas por sednada mais. E esta é a questão do título. O título não é sobre perl.
Radu Rădeanu
Não, o código que publiquei funciona. (Exceto se Loremestiver na última linha, um defeito é compartilhado com a sua versão.)
Gilles 'SO- stop be evil' (
Este exemplo não está funcionando quando há 3 ou mais linhas de texto :(
artnikpro
12

Embora o sed possa corresponder aos padrões em várias linhas (usando os comandos Nou Hpara acrescentar linhas sucessivas antes da correspondência), isso está bem fora da sua zona de conforto. Tente apenas se você gosta de dor.

Perl pode fazer esse tipo de coisa muito bem. Use a -popção para processar a entrada padrão, um registro de cada vez, imprimir o registro modificado (à la sed) e -000ativar o modo de parágrafo (onde os registros são separados por linhas em branco). Em uma expressão regular, \scorresponde a qualquer caractere de espaço em branco, incluindo uma nova linha.

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'

Se você deseja inserir uma nova linha no texto de substituição quando o original contiver uma, isso é mais complicado. Como fazer isso depende dos seus requisitos de onde colocar a nova linha.

Gilles 'SO- parar de ser mau'
fonte
@terdon Ah, eu pretendia permitir vários espaços em branco, mas esqueci. Obrigado, consertado.
Gilles 'SO- stop be evil'
A questão é sobre sed. Também está marcado com sed, não com perl.
Radu Rădeanu
0

O sed não pode ler facilmente através de várias linhas. Use em perl -i -0pe 's/.../.../...'vez disso.

Façam
fonte
7
O sed pode ler em várias linhas!
Radu Rădeanu
3
@ RaduRădeanu Tecnicamente, sim. Mas raramente vale a pena.
Gilles 'SO- stop be evil'
3
@Gilles Se o uso perlfor mais simples para você, isso não significa que sedraramente valha a pena.
Radu Rădeanu 19/09/2013