Ich versuche, mit einer for-Schleife einen Lizenzheader zu allen Header- und Quelldateien in einem Projektverzeichnis hinzuzufügen. Das funktioniert nicht. Gibt es einen anderen Ansatz sed
?
text-processing
shell-script
Satyendra
quelle
quelle
Antworten:
quelle
globstar
Bash einschalten müssen, damit dies funktioniert.Dies ist mehr oder weniger nur ein ausführlicher Kommentar zur Antwort von Daniel Serodio . Ich fing an, es als Kommentar zu schreiben, aber es wurde schnell zu groß ...
Damit ein Bash-Glob rekursiv ist, ist es erforderlich
shopt -s globstar
. Sie müssen globstar aktivieren, sonst**
funktioniert es nicht. Die Globstar-Shell-Option wurde in Version 4 von Bash eingeführt.my.cpp/
Verwenden Sie den Test, um zu vermeiden, dass ein Verzeichnis wie[[ -f $f ]]
... verarbeitet wird. Wenn der Test in doppelten eckigen Klammern steht, müssen Variablen nicht in doppelte Anführungszeichen gesetzt werden.Sie können auch die Möglichkeit in Betracht ziehen, dass keine übereinstimmenden Dateien vorhanden sind, indem Sie verwenden
shopt -s nullglob
, wodurch Muster, die nicht mit Dateien übereinstimmen, zu einer Nullzeichenfolge und nicht zu sich selbst erweitert werden.Mehr Muster zu handhaben , können Sie die Kette die glob Muster:
**/*.cpp **/*.h
, aber vielleicht vorzugsweise, wenn die Schale Option extglob ist auf übershopt -s extglob
können Sie solche Konstrukte verwenden wie**/*.@(cpp|h)
die mehrere Durchgänge über das Dateisystem vermeidet; einmal für jedes Muster.Wenn Sie
.files
einbezogen werden möchten , verwenden Sie.*.cpp
etc oder useshopt -s dotglob
Verwenden Sie
sponge
from package , um das Ändern einer Datei, die weitergeleitet wird, sicher zu handhabenmoreutils
(es erspart Ihnen das Erstellen Ihrer eigenen temporären Datei).quelle
[[
kann aber problemlos mit einer Null umgehen$f
.unset x; [ -f $x ] && echo exists
Berichte "existiert" ... (behoben)**/*.@(cpp|h)
mit$( find . -name "*.h" -name "*.cpp")
Vielen Dank an @fred, @maxmackie, @enzotib.
Können Sie bitte das von mir befolgte Verfahren überprüfen?
Andernfalls wird der Lizenzheader mehrmals kopiert.
Bitte schlagen Sie mir ein Muster vor, um alle Header und Quellen im Projektverzeichnis und in den Unterverzeichnissen zu durchsuchen.
Ich konnte nicht vollständig verstehen, was @fred vorgeschlagen hat.
quelle
targln=2; findln=$(sed -rne $targln'{\|// Copyright|=;q}' "$f"); if ((findln==targln));then
... aber natürlich vor allem gründlich testen ... PS. Unter Unix & Linux ist es selbstverständlich , solche Extras in Ihrer ursprünglichen Frage zu posten , nicht als Antwort ...grep
,-q
Option hinzufügengrep
. Fügen Sie immer doppelte Anführungszeichen hinzu$f
.Sie können dies mit
ex
oder tun,ed
wenn Sie es vorziehen (Sie sollten dies nicht mit dersed
von Ihnen angefordertensed
Option tun , die zum Bearbeiten von Streams vorgesehen ist,-i
was aus verschiedenen Gründen eine schlechte Idee ist):quelle
sed -i
eine schlechte Idee?sed -i
Symlinks und Hardlinks, was zu unerwartetem Verhalten führt. Bestenfalls ist es nicht intuitiv, im schlimmsten Fall ist es aktiv schädlich.Wenn Sie eine
header_file
mit gewünschten Inhalten haben:quelle
quelle
Gerhard Gappmeiers Blog - Wie man rekursiv Dateiköpfe von Quelldateien ersetzt
Der Blog-Beitrag hat eine
tar.gz
Datei angehängt , die die benötigten Dateien enthält.Es hat eine
header.template
Datei, in die Sie einen benutzerdefinierten Kommentar schreiben können. Sie kann mehrere Zeilen umfassen.Es verfügt über ein
remove_header.awk
Skript, das vorhandene Header durch den neuen Header ersetzt.Um es auszuführen:
quelle