Substitua string de múltiplas linhas por outra string de múltiplas linhas em um arquivo de marcação no OS X

0

Eu quero substituir uma sequência de múltiplas linhas em uma marcação por outra (também multilinha). Eu acho que o perl é a melhor opção.

Por exemplo eu quero substituir

## Exercise 1 
some text
some more text

## Points

por

## Exercise 1 
some new text
some more different text

## Points

Isso é o que eu tenho:

FIND=(##\ Exercise\ 1).*(##\ Points)
REPLACE='cat schema.md'
perl -i -pe 'BEGIN{undef $/;} s/$FIND/$REPLACE/smg' P.md

Obrigado por qualquer ajuda!

    
por Jakob Benz 16.01.2016 / 17:08

1 resposta

0

Você precisa usar o tipo certo de citações. Os parênteses têm um significado especial em muitos shells, e as variáveis do shell não funcionam dentro de aspas simples. Além disso, se a sua substituição contiver / ou $ , a sintaxe Perl estará errada e a substituição falhará.

Você pode usar o seguinte script:

perl -i -pe 'BEGIN { undef $/; } s/^## Exercise 1.*^## Points.*?^/'cat schema.md'/sme' P.md

Explicações:

  • BEGIN { undef $/; } faz o Perl ler o arquivo inteiro de uma só vez.
  • s/A/B/sme encontra A em várias linhas, manipula referências anteriores em B, avalia o novo B e usa o resultado como substituto.
  • ^## Exercise 1.*^## Points.*?^ corresponderá a um intervalo de uma linha que começa com ## Exercise 1 até uma linha que começa com ## Points e, em seguida, até a próxima linha começar.
  • 'cat schema.md' significa que quando uma correspondência for encontrada, o Perl executará cat schema.md como um comando shell. Assim, o novo texto será o conteúdo de schema.md.
por 16.01.2016 / 17:47