Alle Dateien in einer Schleife wiedergeben und Dateiheader einfügen

Alle Dateien in einer Schleife wiedergeben und Dateiheader einfügen

Angenommen, ich habe dieses Dummy-Projekt:

$tree -L 3 ~/my-proj
./dir/foo.sh
./bar.sh

Ich möchte in alle *.sh-Dateien einen Copyright-Dateiheader einfügen, mein Header lautet beispielsweise:

/*
 *  Copyright (c) 2015 by MyCompany, Inc.
 *  All rights reserved.
 */

Ich habe Probleme, da es mehrzeilig ist. Ich habe es geschafft, das folgende Skript zu schreiben, aber es funktioniert nicht für mehrzeilige Zeilen:

#!/bin/sh
HEADER=$(cat<<EOH
/*
 *  Copyright (c) 2015 by MyCompany, Inc.
 *  All rights reserved.
 */
)

find ~/my-proj/*.sh -exec sed -i "1s/^/$HEADER\n/" {} \;

Antwort1

Benutze das:

header='/*\n *  Copyright (c) 2015 by MyCompany, Inc.\n *  All rights reserved.\n */\n'
find ~/my-proj/*.sh -exec sed -i "1s|^|$header|" {} \;

Anmerkungen:

  1. Die Shell ersetzt den Wert von $headerdirekt im sed-Befehl. Dies ermöglicht die Einfügung beliebiger Befehle in das sed-Skript.nichttun Sie dies, es sei denn, Sie vertrauen der Quelle header.

  2. Der Header enthält /Zeichen. Entweder müssen diese Zeichen maskiert werden oder der Ersetzungsbefehl muss ein anderes Trennzeichen verwenden. Oben |wurde als Trennzeichen verwendet.

  3. Es empfiehlt sich, für Shellvariablen Kleinbuchstaben oder gemischte Schreibweisen zu verwenden. Das System verwendet für seine Variablen Großbuchstaben. Dies stellt in diesem Fall zwar kein Problem dar, Sie möchten jedoch nicht versehentlich eine Variable überschreiben.

Beispiel

Zur Veranschaulichung des überarbeiteten sed-Befehls betrachten Sie diese Testdatei:

$ cat file
1
2
3

Der sed-Befehl erzeugt:

$ sed "1s|^|$header|" file
/*
 *  Copyright (c) 2015 by MyCompany, Inc.
 *  All rights reserved.
 */
1
2
3

verwandte Informationen