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?


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?


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


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


@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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.