Concatena vários arquivos com duas linhas em branco como delimitador?

4

Estou tentando juntar arquivos Markdown com duas novas linhas entre cada arquivo.

Eu tentei usar o seguinte comando:

paste -sd '\n\n' file1.md file2.md

Isso une os arquivos com uma nova linha, mas não com duas novas linhas, conforme necessário.

Qual comando posso usar para unir um número arbitrário de arquivos com dois caracteres \n entre cada união?

    
por Naftuli Kay 19.05.2015 / 02:16

6 respostas

4

com paste :

:|paste -sd'\n' file1.md - - file2.md
    
por 19.05.2015 / 03:18
3

Com awk você pode processar vários arquivos e imprimir um delimitador antes de cada arquivo ( FNR==1 ), exceto o primeiro ( NR>1 ). Então

awk '(NR>1 && FNR==1){printf ("\n\n")};1' file1.md file2.md ... fileN.md

concatena os arquivos adicionando o delimitador especificado entre eles.

Se você não se importa com um delimitador final na saída final, nesse caso específico (o delimitador é um número de linhas vazias) você também pode fazer (com gnu sed ):

sed -s '${G;G}' file1.md file2.md ... fileN.md
    
por 19.05.2015 / 02:59
2

Além da resposta do cuonglm:

:|paste -sd'\n' $(sed $"s/\s/ - - /g" <<< $(ls -1|paste -sd" " -))

Para que isso funcione, você precisa ter todos os arquivos, que devem ser concatenados dentro de uma pasta e que sejam classificados de forma melhor alfanumérica. A saída pode então ser redirecionada para um arquivo.

O que está acontecendo aqui?

:

Essa é a verdadeira função no bash. Isso é usado principalmente para não-operações, pois retorna apenas como verdade.

|

Isso é um pipe, que recebe a saída do comando esquerdo e pipes na entrada do comando direito.

$(sed $"s/\s/ - - /g" <<< $(ls -1|paste -sd" " -))

Isto apenas constrói a linha que é necessária para colar. Será algo parecido com

file1 - - file2 - - file3 - - file4 ...

Assim, quando colar for chamado, ele gravará todas as linhas dos arquivos listados na saída padrão. Quando um arquivo não é encontrado ou chamado "-", colar lê a entrada padrão e obtém o valor VERDADEIRO de: o qual é canalizado para a pasta.

Normalmente, todo arquivo é anexado a um operador de abas depois que ele é gravado no stdout. com o argumento -d "\ n" para colar, a tab é trocada por uma nova linha.

Agora, colar e gravar os arquivos separados por novas linhas para stdout e quando a pasta localizar um "-", ele obterá a verdadeira e somente gravará o seperador para stdout - a nova linha.

    
por 29.06.2015 / 23:10
1

Com um novo GNU awk :

awk '1; ENDFILE {print "\n"}' files...
    
por 19.05.2015 / 02:59
1
printf '\n\n' | cat file1.md - file2.md

Algo como o cuonglm, eu acho. Aspirando para isso, de qualquer maneira.

    
por 29.06.2015 / 21:20
0

Não é a melhor solução, mas funciona para o seu caso:

echo -e 'cat file1.md'"\n\n"'cat file2.md'
    
por 19.05.2015 / 02:25