Wie finde / ersetze und erhöhe ich eine übereinstimmende Zahl mit sed / awk?

Ich frage mich, wie ich grep / find / sed / awk verwende, um eine bestimmte Zeichenfolge (die mit einer Zahl endet) abzugleichen und diese Zahl um 1 zu erhöhen. Am nächsten komme ich, um eine 1 zu verketten das Ende (was gut genug funktioniert), weil der Hauptpunkt darin besteht, einfach den Wert zu ändern. Folgendes mache ich gerade:

find . -type f | xargs sed -i 's/\(\?cache_version\=[0-9]\+\)/\11/g'

Da ich nicht herausfinden konnte, wie ich die Zahl erhöhen kann, habe ich das Ganze erfasst und einfach eine "1" angehängt. Vorher hatte ich so etwas:

find . -type f | xargs sed -i 's/\?cache_version\=\([0-9]\+\)/?cache_version=\11/g'

Zumindest verstehe ich, wie ich erfassen kann, was ich brauche.

Anstatt zu erklären, wofür dies gedacht ist, erkläre ich einfach, was ich damit machen möchte. Es sollte rekursiv Text in jeder Datei finden, basierend auf dem aktuellen Verzeichnis (ist nicht wichtig, es könnte ein beliebiges Verzeichnis sein, so dass ich das später konfigurieren würde), der "? Cache_version =" mit einer Nummer übereinstimmt. Es erhöht dann diese Zahl und ersetzt sie in der Datei.

Derzeit funktioniert das, was ich oben habe, nur, dass ich die gefundene Zahl am Ende nicht erhöhen kann. Es wäre besser, inkrementieren zu können, anstatt eine "1" anzufügen, damit die zukünftigen Werte nicht "11", "111", "1111", "11111" usw. sind.

Ich habe Dutzende von Artikeln / Erklärungen durchgesehen und oft genug ist der Vorschlag zu verwendenawk, aber ich kann sie nicht für das Leben von mir mischen. Am nächsten kam ich mitawk, was eigentlich nichts ersetzt, ist:

grep -Pro '(?<=\?cache_version=)[0-9]+' . | awk -F: '{ print "match is", $2+1 }'

Ich frage mich, ob es eine Möglichkeit gibt, eine Pfeife zu spielensed am ende und übergebe den originalen dateinamen damitsed kann den Dateinamen und die inkrementelle Nummer haben (von derawk) oder was auch immer es brauchtxargs hat.

Technisch hat diese Zahl keine Bedeutung; Dieser Ersatz dient hauptsächlich dazu, sicherzustellen, dass es eine neue Nummer gibt, die sich mit Sicherheit zu 100% von der letzten unterscheidet. Als ich diese Frage schrieb, wurde mir klar, dass ich genauso gut die Systemzeit - Sekunden seit der Epoche (die von AJAX häufig verwendete Technik, um das Caching für nachfolgende "identische" Anforderungen zu eliminieren) verwenden könnte. Am Ende war es so, und es scheint perfekt zu sein:

CXREPLACETIME=`date +%s`; find . -type f | xargs sed -i "s/\(\?cache_version\=\)[0-9]\+/\1$CXREPLACETIME/g"

(Ich speichere den Wert zuerst, damit alle Dateien den gleichen Wert erhalten, falls er sich aus irgendeinem Grund über mehrere Sekunden erstreckt.)

Aber ich würde immer noch gerne die ursprüngliche Frage zum Inkrementieren einer übereinstimmenden Zahl kennen. Ich vermute, eine einfache Lösung wäre, es zu einem Bash-Skript zu machen, aber ich dachte, es gäbe eine einfachere Möglichkeit, als jede Datei rekursiv zu durchlaufen und ihren Inhalt auf Übereinstimmungen zu überprüfen und sie dann zu ersetzen, da es sich lediglich um das Inkrementieren einer übereinstimmenden Zahl handelt ... sonst nicht viel Logik. Ich möchte einfach nicht in andere Dateien oder ähnliches schreiben - es sollte es an Ort und Stelle tun, wiesed macht mit der "i" -Option.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage