Sed substituir por uma frase em várias linhas

11

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

Isto:

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 seja em duas linhas em vez de uma?

    
por DᴀʀᴛʜVᴀᴅᴇʀ 18.09.2013 / 21:42

3 respostas

16

O seguinte comando funcionará nas duas situações:

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

Mais explicações: Como pode Usar sed para substituir uma string de várias linhas?

    
por Radu Rădeanu 19.09.2013 / 00:27
12

Enquanto sed pode combinar padrões em várias linhas (usando os comandos N ou H para acrescentar linhas sucessivas antes da correspondência), isso está bem fora de sua zona de conforto. Tente apenas se você gosta de dor.

O Perl pode fazer bem esse tipo de coisa. Use a -p switch para fazer com que ela processe uma entrada padrão de cada vez e imprima o registro modificado (à la sed) e -000 para ativar o modo de parágrafo (onde os registros são separados por linhas em branco). Em uma expressão regular, \s corresponde a qualquer caractere de espaço em branco, incluindo um 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ê quiser colocar uma nova linha no texto de substituição quando o original contiver um, isso é mais complicado. Como fazer isso depende de seus requisitos para onde colocar a nova linha.

    
por Gilles 19.09.2013 / 00:32
0

sed não consegue ler facilmente em várias linhas. Use perl -i -0pe 's/.../.../...' em vez disso.

    
por To Do 19.09.2013 / 00:07