Ersetzen eines bestimmten Textes in mehreren Dateien

Ersetzen eines bestimmten Textes in mehreren Dateien

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 sedoder grepkann 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

verwandte Informationen