Substituir o bloco cercado pela saída do comando no bash

1

Estou tentando substituir um bloco de texto "protegido" pela saída do comando tree no linux (especificamente em um arquivo make). Aqui está o meu arquivo de entrada:

some text...
[fencetitle]
----
.
├── file1.txt
└── test
    └── file2.txt

1 directory, 2 files
----
some more text...

Eu gostaria de substituir o conteúdo pela saída do comando tree :

some text...
[fencetitle]
----
.
├── file1.txt
├── newfile.txt
└── test
    └── file2.txt

1 directory, 3 files
----
some more text...

Usando o comando sed, não consigo corresponder usando novas linhas com a linha [fencedtitle] e ---- to ---- . No entanto, posso substituir o texto entre [fencedtitle] e ---- pelo seguinte comando:

sed -n '/\[fencedtitle\]/{:a;N;/----/!ba;N;s/.*\n/REPLACEMENT\n/};p' file

Mas não consigo substituir SUBSTITUIÇÃO pela saída do comando tree. O sed é a abordagem correta aqui, ou é algo mais apropriado?

    
por John Ericksen 19.02.2018 / 02:10

2 respostas

2

Você poderia tentar algo como:

sed -n "/\[fencedtitle\]/{:a;N;/----/!ba;N;s/.*\n/$(tree)\n/};p" file

Mas isso será problemático se a saída de tree contiver caracteres especiais para regex. Se você salvar a saída de tree em um arquivo:

tree > my-out

Então você pode lê-lo no sed sem muitos problemas:

sed -n '/\[fencetitle\]/{p;n;p;r my-out
:a;n;/^----$/!ba};p' file

(Sim, o comando r requer uma nova linha depois disso, nenhum comando pode segui-lo na mesma linha.)

O p;n;p; apenas imprime o início da cerca, depois lemos o arquivo, depois pulamos tudo até o final da cerca.

Você pode finalizar a linha após o comando r dividindo o restante em uma expressão sed separada:

sed -ne '/\[fencetitle\]/{p;n;p;r my-out' -e ':a;n;/^----$/!ba};p' file
    
por 19.02.2018 / 03:33
0

Eu fiz pelo método abaixo para o exemplo acima

sed "s/file1.txt/&\n|__newfile/g" example.txt

saída

some text...
[fencetitle]
----
.
├── file1.txt
|__newfile
└── test
    └── file2.txt
    
por 19.02.2018 / 11:33