Ich habe ein C-Projekt mit vielen Header- und Quelldateien. In diesen Dateien habe ich eine Kommentarzeile für die Programmversion. So etwas wie:
/**
* all the file info and stuff....
* VER: 0.01
* rest of comments
*/
//code ....
Ich möchte die Version in allen Unterordnern des Projekts rekursiv bearbeiten. Einige der Dateien haben diese Zeile, andere nicht. Wie geht das mit Standardprogrammen von GNU/Linux? Ich vermute es sed
oder grep
kann helfen!
Antwort1
Versuche dies
find . -type f -name '*.[ch]' -exec bash -c '
grep -q "VER: [0-9]" "$1" && sed -i.bak "s/VER: [0-9].*/VER: 1.42/" "$1"
' -- {} \;
Wenn Sie sich nicht mit der Erstellung einer .bak-Datei (Sicherungsdatei) herumschlagen möchten, können Sie es etwas vereinfachen:
find . -type f -name '*.[ch]' -exec sed -i 's/VER: [0-9].*/VER: 1.42/' {} \;
Oder diesesxargs+grepAusführung
(funktioniert nicht mit Dateien, deren Namen Leerzeichen enthalten)
grep -rl 'VER: [0-9].*' . |
grep '.*\.[ch]$' |
xargs sed -i 's/VER: [0-9].*/VER: 1.42/'
Oder mitbash globstarRekursion
shopt -s globstar
sed -i 's/VER: [0-9].*/VER: 1.42/' **/*.[hc]
Oder mitzsh
sed -i 's/VER: [0-9].*/VER: 1.42/' **/*.[hc]
Antwort2
Ich würde einfach separate Befehle zum Suchen und Ersetzen der Dateien ausführen.
find . -type f \(-name "*.c" -o -name "*.h" \) | xargs grep -l "VER: 0.01" > files;
for file in $(cat files);do sed -i "s/VER: 0.01/VER: 0.02/g" $file
done