com paste
:
:|paste -sd'\n' file1.md - - file2.md
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?
com paste
:
:|paste -sd'\n' file1.md - - file2.md
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
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.
Com um novo GNU awk
:
awk '1; ENDFILE {print "\n"}' files...
printf '\n\n' | cat file1.md - file2.md
Algo como o cuonglm, eu acho. Aspirando para isso, de qualquer maneira.
Não é a melhor solução, mas funciona para o seu caso:
echo -e 'cat file1.md'"\n\n"'cat file2.md'
Tags files text-processing paste