Wie kann ich sed verwenden, um Urheberrechts- / Lizenz-Header in meinen Quelldateien zu ersetzen?

8

Ich muss den LGPL-Lizenz-Header in allen meinen Java-Quelldateien durch den Apache License 2.0-Header ersetzen, d. h. durch diesen

%Vor%

muss

werden %Vor%

Ich dachte mir, der einfachste Weg wäre, sed zu benutzen, um einen Fund zu finden und alle Vorkommen dieses Copyright-Headers zu ersetzen. Ich bin ein bisschen wie ein Unix-Neuling, daher hatte ich Probleme, den Befehl so zu bekommen, wie ich es brauchte - insbesondere mit den mehrzeiligen Strings umzugehen. Grundsätzlich so etwas wie unten, mit Ausnahme der jeweiligen Header anstelle von foo und bar :

%Vor%

Ich verstehe, dass sed immer auf einer Zeile arbeitet, also gibt es vielleicht eine bessere Lösung?

    
Tyler Treat 01.01.2013, 01:39
quelle

3 Antworten

12
%Vor%

Der Befehl c ändert den Zeilenbereich in den angegebenen Text. Der Bereich wird durch die Zeile "Project Foo ist freie Software" bis zur Zeile mit "zusammen mit Project Foo" gekennzeichnet. Die -i -Option zu sed gibt an, dass GNU sed ; Daher nehme ich an, dass Sie auch GNU find und xargs verwenden und -print0 und -0 verwenden, um Probleme mit Leerzeichen in Dateinamen usw. zu vermeiden.

Dafür könnte ich versucht sein, das Skript sed in eine Datei ( sed.script ) zu schreiben, die dann mit:

verwendet werden kann %Vor%

Das ist besser, denke ich, aber Schönheit liegt im Auge des Betrachters.

  

Nur eine Frage: Die Ausrichtung ist auf den Sternen ein wenig aus. Gibt es eine Art Leerzeichen, das ich verwenden muss, um sie einzurücken? Ich habe versucht, Leerzeichen zu der Ersatzzeichenfolge hinzuzufügen, aber das schien keine Wirkung zu haben.

Grrr ... das ist die Art von Verärgerung, auf die ich verzichten könnte (und Sie auch). Es scheint, dass führende Leerzeichen in den Datenzeilen "Ändern" um sed fallen gelassen werden. Es scheint sed zu sein anstatt bash ; Ich habe das gleiche Ergebnis mit ksh und auch eine Skriptdatei anstelle der Option -e in der Befehlszeile verwendet. Sie können die Änderungsdaten nicht bearbeiten, während sie ausgegeben werden.

Ein Trick, der funktionieren würde - aber Sie sind vielleicht nicht scharf darauf:

%Vor%

Das Programm s2p ist ein Standardteil der Perl-Distribution, der sed -Skripte in Perl-Skripte konvertiert, aber die führenden Leerzeichen in den Ersatzdaten behält. Ich bin nicht scharf darauf, aber die einzige Alternative, die ich mir vorstellen kann, ist, zwei Durchgänge durch jede Datei zu machen. Die Ersatzdaten könnten sein:

%Vor%

Nachdem Sie den Haupttext ersetzt haben, tun Sie Folgendes:

%Vor%

Dies verfolgt die Zeilen beginnend mit @*@ und ersetzt diesen Text durch ' * ' (Leerzeichen-Stern). Nicht so sauber und ordentlich, aber das wirst du nicht allzu oft tun, vertraue ich.

    
Jonathan Leffler 01.01.2013, 02:11
quelle
5

Teillizenzaustausch mit GNU Sed

Sie können GNU sed verwenden, um dies mit einigen Übereinstimmungen mit regulären Ausdrücken und einem Leseausdruck zu lösen. Hier sind die Schritte.

Verwenden Sie eine Datei, um Ersatztext zu halten

Erstellen Sie zuerst eine Datei, die den Ersatzteil Ihrer Lizenz enthält:

%Vor%

Führen Sie die tatsächliche Sed Invocation

aus

Als nächstes führen Sie find aus, um Ihre Dateiliste zu sammeln, und rufen Sie das folgende sed Skript auf, um die Änderungen vorzunehmen:

%Vor%

Kompatibilitätshinweis

Diese Lösung funktioniert möglicherweise nicht mit anderen Versionen von sed, wurde aber lokal getestet und funktioniert bekanntermaßen mit GNU sed Version 4.2.1. Wenn es nicht mit der Version von sed funktioniert, die mit Ihrer Edition von OS X geliefert wurde, können Sie GNU sed über MacPorts oder ähnlich installieren.

    
Todd A. Jacobs 01.01.2013 02:11
quelle
2

Angenommen, Datei1 enthält Ihren Originaltext und Datei2 enthält Ihren Ersatz-Copyright-Kommentar:

%Vor%

Der obige Text sucht nur nach der ersten Kommentarzeile in der Originaldatei. Wenn er gefunden wird, wird die Ersatzdatei gefunden und für den Rest der Originaldatei gedruckt.

    
Ed Morton 01.01.2013 17:36
quelle