2012-12-26 6 views

Antwort

17

ich wahrscheinlich sed für diesen Job verwenden würde, :

line=3 
sed -e "${line}r file2" file1 

Wenn Sie file1 überschreiben und GNU sed haben möchten, fügen Sie die Option -i hinzu. Andernfalls schreibe in eine temporäre Datei und kopiere/verschiebe die temporäre Datei dann über das Original und bereinige es wie nötig (das ist das trap Zeug unten). Hinweis: Beim Kopieren der temporären Datei werden Verknüpfungen beibehalten. Verschieben geht nicht (ist aber schneller, besonders wenn die Datei groß ist).

line=3 
tmp="./sed.$$" 
trap "rm -f $tmp; exit 1" 0 1 2 3 13 15 
sed -e "${line}r file2" file1 > $tmp 
cp $tmp file1 
rm -f $tmp 
trap 0 
+0

danke m8, das wird es tun! –

1
cat file1 >>file2 

wird Inhalt von Datei1 an Datei2 anhängen.

cat file1 file2 

wird Datei1 und Datei2 verketten und Ausgabe an Terminal senden.

cat file1 file2 >file3 

wird erstellen oder Überschreibungs file3 mit Verkettung von Datei1 und Datei2

wird Verkettung von Datei1 und Datei2 bis Ende file3 hängen.

bearbeiten:

Für Trunking file2 vor dem Hinzufügen von file1:

sed -e '11,$d' -i file2 && cat file1 >>file2 

oder für ein 500 Zeilen machen file:

n=$((500-$(wc -l <file1))) 
sed -e "1,${n}d" -i file2 && cat file1 >>file2 
+0

Ich weiß, dass (ich möchte nicht unhöflich klingen), was ich tun möchte, ist cat file1 >> file2 aber "cat" es zu einer bestimmten Zeile von file2. Haben Sie eine Idee, wie es geht? Du wirst meinen Tag machen! –

+0

Natürlich, Datei1 als weniger als 500 Zeilen in meiner letzten Probe! – techno

7

Just for fun, und nur weil wir alle lieben ed, die Standard-Editor, hier ist eine ed Version. Es ist sehr effizient (ed ist ein echter Texteditor)!

ed -s file2 <<< $'3r file1\nw' 

Wenn die Zeilennummer in der Variablen line dann gespeichert:

ed -s file2 <<< "${line}r file1"$'\nw' 

Gerade Zack zu gefallen, hier ist eine Version mit weniger bashism, falls Sie bash nicht persönlich mag (ich nicht wie Rohre und Subshells, ziehe ich herestrings, aber hey, wie gesagt, das ist nur Zack gefallen):

printf "%s\n" "${line}r file1" w | ed -s file2 

oder (bitte Sorpigal):

printf "%dr %s\nw" "$line" file1 | ed -s file2 

Als Jonathan Leffler erwähnt in einem Kommentar, und wenn Sie beabsichtigen, diese Methode in einem Skript zu verwenden, verwenden Sie einen heredoc (es ist in der Regel der effizienteste):

ed -s file2 <<EOF 
${line}r file1 
w 
EOF 

hoffe, das hilft!

P.S. Zögern Sie nicht, einen Kommentar zu hinterlassen, wenn Sie das Gefühl haben, Sie müssen sich über die Möglichkeiten zum Fahren ed, dem Standard-Editor, äußern.

+0

Das ist schlau, aber wenn ich etwas aufwertee, das 'ed' und Bashismen im selben Atemzug verwendet, verliere ich meinen alten Bartstatus. 'printf '3r Datei1 \ nw' | ed -s datei2', bitte. – zwol

+0

@Zack entsprechend bearbeitet ';-)' –

+0

Ein geradliniges altmodisches Here-Dokument ('<< EOF') wird anstelle des' <<< 'Bashism funktionieren. –

1

Viele Möglichkeiten, es zu tun, aber ich mag es, einen Weg zu wählen, der die Herstellung von Werkzeugen beinhaltet.

Zuerst Setup Testumgebung

rm -rf /tmp/test 
mkdir /tmp/test 
printf '%s\n' {0..9} > /tmp/test/f1 
printf '%s\n' {one,two,three,four,five,six,seven,eight,nine,ten} > /tmp/test/f2 

Lassen Sie uns nun das Werkzeug machen, und in diesem ersten Durchgang werden wir es schwer umzusetzen.

# insert contents of file $1 into file $2 at line $3 
insert_at() { insert="$1" ; into="$2" ; at="$3" ; { head -n $at "$into" ; ((at++)) ; cat "$insert" ; tail -n +$at "$into" ; } ; } 

Dann starten Sie das Tool, um die erstaunlichen Ergebnisse zu sehen.

$ insert_at /tmp/test/f1 /tmp/test/f2 5 

Aber warten Sie, das Ergebnis ist auf stdout! Was ist mit dem Überschreiben des Originals? Kein Problem, dafür können wir ein anderes Werkzeug erstellen.

insert_at_replace() { tmp=$(mktemp) ; insert_at "[email protected]" > "$tmp" ; mv "$tmp" "$2" ; } 

und führen Sie es

$ insert_at_replace /tmp/test/f1 /tmp/test/f2 5 
$ cat /tmp/test/f2 

"Ihre Umsetzung saugt!"

Ich weiß, aber das ist die Schönheit der Herstellung einfacher Werkzeuge. Lassen Sie uns insert_at mit der Sed-Version ersetzen.

insert_at() { insert="$1" ; into="$2" ; at="$3" ; sed -e "${at}r ${insert}" "$into" ; } 

Und insert_at_replace funktioniert weiter (natürlich). Die Implementierung von insert_at_replace kann auch geändert werden, um weniger Buggy zu sein, aber ich werde das als eine Übung für den Leser verlassen.

Verwandte Themen