Como inserir o conteúdo do arquivo após uma determinada string em um arquivo? [duplicado]

1

temos por exemplo este arquivo

cat exam.txt

I am expert linux man
what we can do for out country
I love redhat machine
"propertie"
centos less then redhat
fedore what
my name is moon yea

queremos adicionar o conteúdo de qualquer arquivo como arquivo.txt após a linha de propriedades

cat file.txt

324325
5326436
3245235
646346
545
643
6436
63525
664
46454

então eu tentei o seguinte:

a=' cat file '

sed -i '/propertie/a  'echo "$a"' ' exam.txt

mas não funciona

alguma sugestão com sed / awk / perl one liner para adicionar conteúdo do arquivo após uma string?

saída esperada

I am expert linux man
what we can do for out country
I love redhat machine
"propertie"
    324325
    5326436
    3245235
    646346
    545
    643
    6436
    63525
    664
    46454
centos less then redhat
fedore what
my name is moon yea
    
por yael 28.05.2018 / 20:10

1 resposta

6

Você quase nunca quer armazenar o conteúdo completo de um arquivo em uma variável em um script de shell Unix. Se você se encontrar fazendo isso, pergunte a si mesmo se existe outra solução. Se você não consegue encontrar um por conta própria, venha aqui e vamos dar uma olhada: -)

$ sed '/propertie/r file.txt' exam.txt
I am expert linux man
what we can do for out country
I love redhat machine
"propertie"
324325
5326436
3245235
646346
545
643
6436
63525
664
46454
centos less then redhat
fedore what
my name is moon yea

O comando r ("read") em sed aceita um nome de arquivo como argumento e insere o conteúdo do arquivo no fluxo atual.

Se você precisar do conteúdo adicionado recuado, certifique-se de que o conteúdo de file.txt seja recuado antes de executar sed :

$ sed 's/^/    /' file.txt >file-ind.txt
$ sed '/propertie/r file-ind.txt' exam.txt
I am expert linux man
what we can do for out country
I love redhat machine
"propertie"
    324325
    5326436
    3245235
    646346
    545
    643
    6436
    63525
    664
    46454
centos less then redhat
fedore what
my name is moon yea

Com ed (chamando sed para o recuo do arquivo inserido). Isso também faz a edição no local do arquivo e substitui o original pelo conteúdo modificado.

ed -s exam.txt <<END_ED
/propertie/r !sed 's/^/    /' file.txt
wq
END_ED

O comando r em ed é capaz de ler a saída de um comando externo se o comando tiver o prefixo ! . Usamos isso para recuar os dados que gostaríamos de inserir. Caso contrário, por razões óbvias, é muito semelhante à solução sed acima.

A única desvantagem de usar ed é que você geralmente não pode usá-lo em arquivos muito grandes. sed é para editar streams de comprimentos indeterminados, enquanto ed é ok para editar documentos que você pode ver abrindo em qualquer outro editor, ou seja, não arquivos de muitos megabytes ou gigabytes de tamanho.

    
por 28.05.2018 / 20:14