Wie kann man Dateien mit unterschiedlichen Daten in Bash zusammenfügen?

7

So kann man mit cat ganz einfach Dateien in bash zusammenfügen:

cat *.txt > all.txt

Was aber, wenn man etwas zwischen die Eingabedateien einfügen möchte, wie zum Beispiel einen Zeilenvorschub?

Roger Ertesvag
quelle

Antworten:

7

Benötigt GNU sed:

sed -s '$G' *.txt > all.txt

Fügen Sie nach jeder Datei eine Zeile mit 8 Bindestrichen und eine neue Zeile hinzu

sed -s '$a--------' *.txt

Sie können Ihr sed '$ d' damit verwenden

Vergleichen Sie mit diesen:

Fügen Sie vor jeder Datei eine Zeile mit Bindestrichen ein:

sed -s '1i--------' *.txt

Machen Sie dasselbe, aber ohne Zeilenumbruch nach den Bindestrichen:

sed -s '1s/^/--------/' *.txt

Fügen Sie am Ende der letzten Zeile jeder Datei eine Zeile mit Bindestrichen ein:

sed -s '$s/$/--------/' *.txt

Umschließen Sie jede Datei mit geschweiften Klammern:

sed -s -e '1i{' -e '$a}' *.txt
Dennis Williamson
quelle
Als elegante Lösung zum Einfügen von Zeilenumbrüchen habe ich eine kleine Änderung vorgenommen, um nur die Zeilenumbrüche zwischen den Originaldateien und nicht am Ende zu haben: sed -s '$ G' * .txt | sed '$ d'> all.txt Kann diese Methode auch zum Einfügen anderer Daten verwendet werden, um der allgemeinen Frage besser zu entsprechen?
Roger Ertesvag
@ Roger: sed -s '$a--------' *.txtFüge nach jeder Datei eine Zeile mit 8 Bindestrichen und eine neue Zeile hinzu. Sie können Ihr sed '$d'damit verwenden. Vergleichen Sie auf diese: sed -s '1i--------' *.txt, sed -s '1s/^/--------/' *.txt, sed -s '$s/$/--------/' *.txtundsed -s -e '1i{' -e '$a}' *.txt
Dennis Williamson
Können Sie diese Optionen zur Antwort hinzufügen?
Roger Ertesvag
6

Als Einzeiler mit Unterschalen:

( for i in *.txt ; do cat $i ; echo 'separator here' ; done ) >all.txt

Die Subshell führt folgende Aktionen aus, die in Skriptzeilen unterteilt sind:

für i in * .txt
tun
cat $ i
echo 'separator goes here' 
erledigt

In diesem Beispiel verhält sich das Trennzeichen wie eine Fußzeile. Fügen Sie eine Überschrift hinzu, indem Sie eine andere echovor der hinzufügen cat.

Gorilla
quelle
2
Die Subshell ist nicht erforderlich, und Sie sollten die Variablenerweiterung in doppelte Anführungszeichen setzen, um Leerzeichen in den Dateinamen zu schützen. for i in *.txt; do cat "$i"; echo 'stuff'; done > all.txt
Chris Johnsen
Kann dies geändert werden, um das Trennzeichen nicht am Ende der Ergebnisdatei einzufügen, sondern nur zwischen den Originaldateien?
Roger Ertesvag
@ Roger:files=(*.txt); indices=(${!files[@]}); for i in ${indices[@]}; do cat "${files[i]}"; if [[ $i != ${indices[@]: -1} ]]; then echo "separator"; fi; done > all.txt
Dennis Williamson
1
catWithSep() { sep="$1"; shift; first=''; for f; do test -n "$first" && echo "$sep"; cat "$f"; first=no; done; }; catWithSep separator *.txt
Chris Johnsen
@ Chris: schön!
Dennis Williamson