Então, pode-se facilmente juntar arquivos no bash com o cat:
cat *.txt > all.txt
Mas e se alguém quiser inserir algo entre os arquivos de entrada, como por exemplo um avanço de linha?
Requer GNU sed
:
sed -s '$G' *.txt > all.txt
acrescentar uma linha de 8 traços e uma nova linha após cada arquivo
sed -s '$a--------' *.txt
Você pode usar seu sed '$ d' com isso
Compare com estes:
Inserir uma linha de traços antes de cada arquivo:
sed -s '1i--------' *.txt
Faça o mesmo, mas sem uma nova linha após os traços:
sed -s '1s/^/--------/' *.txt
Coloque uma linha de traços no final da última linha de cada arquivo:
sed -s '$s/$/--------/' *.txt
Envolva cada arquivo com chaves:
sed -s -e '1i{' -e '$a}' *.txt
sed -s '$a--------' *.txt
acrescentaria uma linha de 8 traços e uma nova linha após cada arquivo. Você pode usar o seused '$d'
com isso. Compare a estes:sed -s '1i--------' *.txt
,sed -s '1s/^/--------/' *.txt
,sed -s '$s/$/--------/' *.txt
esed -s -e '1i{' -e '$a}' *.txt
Como um one-liner com subshells:
Veja o que o subshell executa dividido em linhas de estilo de script:
Neste exemplo, o separador age como um rodapé; adicione um cabeçalho adicionando outro
echo
antes docat
.fonte
for i in *.txt; do cat "$i"; echo 'stuff'; done > all.txt
files=(*.txt); indices=(${!files[@]}); for i in ${indices[@]}; do cat "${files[i]}"; if [[ $i != ${indices[@]: -1} ]]; then echo "separator"; fi; done > all.txt
catWithSep() { sep="$1"; shift; first=''; for f; do test -n "$first" && echo "$sep"; cat "$f"; first=no; done; }; catWithSep separator *.txt