Juntando fluxos

-1

Você normalmente pode canalizar as operações

a | b | c

em que b recebe a entrada de a e a envia para c . Tem apenas uma entrada, gerada por um. Mas e se eu quiser substituir um cabeçalho no arquivo b . Eu, portanto, faço eco de um novo cabeçalho (isso é a operation). Além disso, eu cat b | dd bs=1 skip=header_size para remover o cabeçalho do arquivo. Esta é a operação bc . Agora eu tenho duas saídas, produzidas por echo new_header e cat . Como faço para concatená-los?

    
por Little Alien 22.06.2016 / 18:38

2 respostas

3

Você perguntou "Como posso concatená-los?" - e a resposta é, simplesmente, com cat :

NAME
       cat - concatenate files and print on the standard output

SYNOPSIS
       cat [OPTION]... [FILE]...

DESCRIPTION
       Concatenate FILE(s), or standard input, to standard output.


Observe, em particular, que suas entradas podem incluir entrada padrão, não apenas arquivos. Por exemplo, você pode:

  1. misture entradas e arquivos padrão

    echo "new text" | cat - oldfile > newfile
    
  2. misturar substituições padrão de entrada e processo

    echo "new text" | cat - <(some_command oldfile) > newfile
    

    por exemplo,

    echo "new header" | cat - <(dd if=oldfile bs=1 skip=$header_size) > newfile
    

Alternativamente, você poderia usar um documento aqui e incorporar a saída do comando usando substituição de comando - essa é provavelmente uma opção melhor se o seu texto substituto consistir em mais de uma linha eg

$ cat > newfile << EOF
new
multi-line
header
$(dd if=oldfile bs=1 skip=$header_size)
EOF
    
por steeldriver 22.06.2016 / 20:25
0

Se você não gosta de voodoo de substituição de processo de shell, você também pode usar um simples redirecionamento de um grupo de comando:

{ printf '%s\n' 'header line 1' 'header line 2' ...; tail -c +$(($header_size+1)) old-file.txt; } > new-file.txt
    
por David Foerster 10.02.2018 / 19:52