Eu tenho vários arquivos que quero atualizar substituindo uma sequência de linhas múltiplas por outra sequência de linhas múltiplas. Algo ao longo das linhas de:
* Some text,
* something else
* another thing
E eu quero substituí-lo por:
* This is completely
* different text
O resultado seria que, após a substituição, o arquivo que contém o primeiro bloco de texto agora conterá a segunda sequência (o restante do arquivo permanecerá inalterado).
Parte do problema é que tenho que encontrar a lista de arquivos a serem atualizados no sistema de arquivos. Eu acho que posso usar grep para isso (embora, novamente, isso não seja tão fácil de fazer com strings de várias linhas) e canalizá-lo no sed, talvez?
Existe uma maneira fácil de fazer isso? Sed é uma opção, mas é complicado porque eu tenho que adicionar \ n etc. Existe uma maneira de dizer "pegue a entrada deste arquivo, combine-a com esses arquivos e substitua-a pelo conteúdo desse outro arquivo"? Posso usar python, se necessário, mas quero algo rápido e simples; portanto, se houver um utilitário disponível, prefiro usá-lo do que escrever meu próprio script (que sei fazer).
some text, something else another thing
se ele abrange ou não várias linhas? Ou você só quer combinarsome text,\nsomething else\nanotherthing
?Respostas:
Substitua "Some ... \ n ... Thing" pelo conteúdo do arquivo "new" em um ou mais arquivos de entrada
-i
mudar input.txt diretamente-p0
slurp arquivo de entrada e imprima-o no finals/regexp/.../s
no regexp.
é.|\n
s/.../exp/e
substituir poreval(exp)
s/Some text\n...\n...thing\n/...
fonte
perl -i -p0e ' $b= `cat before`; s/$b/Some thing\n/se' input.txt ...
Receio que você tenha dificuldades em encontrar uma solução que atenda a você até elaborar uma descrição concreta do problema - mas é para isso que o controle de qualidade é mais adequado. Talvez isso lhe dê uma idéia - ele sempre manterá três linhas no espaço do padrão de cada vez - com um visor de duas linhas - enquanto desliza para frente através do arquivo de entrada apenas uma linha de cada vez.
Ele deve ser capaz de corresponder à sua cadeia de caracteres, seja ela de várias linhas ou não - até três, ou seja. Mas não há disposições para espelhar essa disposição na substituição - ela abrange sempre duas linhas, conforme escrito.
fonte
Não é forte (porque não chechou a segunda corda, mas é fácil de resolver) e pode ser que não seja compilador posix, mas muito simples:
O primeiro comando adiciona linhas de Algum texto até encontrar outra coisa e a segunda linha altera-a para outro texto.
NOTA A limitação é que alguns textos devem sempre ser seguidos por outra coisa .
fonte