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?
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?
Respostas:
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 seu sed '$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:
( for i in *.txt ; do cat $i ; echo 'separator here' ; done ) >all.txt
Veja o que o subshell executa dividido em linhas de estilo de script:
para i em * .txt Faz gato $ i eco 'separador vai aqui' feito
Neste exemplo, o separador age como um rodapé; adicione um cabeçalho adicionando outro echo
antes do cat
.
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