In einem Ordner auf meinem System habe ich ein C++
Projekt, das ich zu kompilieren versuche.
Dabei kommen einige C++
Idiome zum Einsatz, die von meiner Compilerversion nicht unterstützt werden. Insbesondere wird im Code oft der Datenwert verwendet 'nullptr'
.
nullptr
Ich möchte alle Vorkommen von durch ersetzen NULL
.
VIM
Dies kann ich mit dem folgenden Befehl tun :
:%s/nullptr/NULL/g
Wie kann ich dies auf einmal für alle Dateien in einem Verzeichnis tun, ohne jede Datei zu öffnen und den Befehl auszuführen?
Antwort1
for file in /path/to/dir/*; do
sed -i s/nullptr/NULL/g "$file"
done
Unterverzeichnisse sind hiervon allerdings nicht betroffen.
Bearbeiten 1
Die schnellere Lösung (mit GNU):
find /path/to/dir -type f -print0 | xargs -0 sed -i s/nullptr/NULL/g
Dies würde auch Unterverzeichnisse (und Dotfiles) betreffen. Fügen Sie es hinzu, -maxdepth 1
wenn dies nicht gewünscht ist.
Antwort2
Hierfür gibt es zwei Möglichkeiten:
vim
Sie können vim von der Befehlszeile aus wie folgt verwenden:
$ vim -c "%s/nullptr/NULL/g|wq" foo.txt
In eine For-Schleife einbinden:
$ for i in *; do vim -c "%s/nullptr/NULL/g|wq" -- "$i"; done
Perl
$ perl -p -i -e 's/nullptr/NULL/g' foo.txt
In eine For-Schleife einbinden:
$ for i in *; do perl -p -i -e 's/nullptr/NULL/g' -- "$i"; done
Oder einfach:
$ perl -p -i -e 's/nullptr/NULL/g' -- *
Antwort3
Mit GNU-Tools:
grep -rlZ nullptr /path/to/dir |
xargs -r0 sed -i s/nullptr/NULL/g
Um zu vermeiden, dass jede Datei neu geschrieben werden muss.
Wie immer bei sed -i
, denken Sie daran, dass Links (hart und weich) beschädigt werden können, der Besitz und die Berechtigungen von Dateien geändert werden können und die Spärlichkeit und möglicherweise andere ungewöhnliche Attribute von Dateien verändert werden können. Beachten Sie auch, dass grep
frühere GNU-Versionen 2.12
beim Absteigen im Verzeichnisbaum mit symbolischen Links folgen -r
.