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.
danke m8, das wird es tun! –