Ich habe eine Reihe von .conf
Dateien, die identisch sind und sich im selben Verzeichnis befinden, mit Ausnahme unterschiedlicher Dateinamen. In jeder eindeutig benannten .conf
Datei möchte ich eine Reihe von Zeichen in der Datei durch den Namen der Datei ersetzen. Zum Beispiel:
Derzeit in allen Dateien:
datafname = example.nex
ofprefix = best.example
Ideale Ausgabe:
Dateiname: 25.conf
datafname = 25.nex
ofprefix = best.25
Dateiname: 26.conf
datafname = 26.nex
ofprefix = best.26
Ich dachte, ich könnte sed
all diese Dateien durchgehen, um die Textzeichenfolge zu finden und durch den Dateinamen zu ersetzen.
sed -i conf 's/example/echo $f/g' *
aber das funktioniert nicht richtig. Würde jemand zufällig einen Vorschlag dazu haben?
quelle
Sie können eine for-Schleife verwenden, um die Dateien zu durchlaufen. Verwenden Sie die Parametererweiterung, um die Dateierweiterung zu entfernen. Verwenden Sie doppelte Anführungszeichen um den Ausdruck, da sonst die Variable nicht erweitert wird.
quelle
Mit GNU können Sie die Aufgabe ohne Schleife ausführen
parallel
:Dies ist besonders nützlich, wenn Sie viele Dateien bearbeiten müssen, da
parallel
ein Job pro CPU-Kern ausgeführt wird.-i.old
bedeutet: Bearbeiten Sie die Dateii
n-place und erstellen Sie eine Sicherungskopie, indem Sie die.old
Erweiterung zum ursprünglichen Dateinamen hinzufügen (entfernen.old
Sie diese , wenn Sie keine Sicherungskopie wünschen, aber denken Sie daran, dass Sie dann keine Sicherungskopie haben).s/example/{.}/g
bedeutets
ubstituteexample
mit dem eingegebenen Dateinamen ohne seine Erweiterung ({.}
) und mache esg
lobal (= bei jedem Auftreten){}
wird durch den Eingabedateinamen ersetzt:::
trennt den auszuführenden Befehl von den Argumenten, die an ihn übergeben werden sollen*.conf
stimmt mit jeder.conf
Datei im aktuellen Verzeichnis übereinquelle
man parallel
jetzt beschrieben. Vielen Dank!parallel
abgedeckt! Es ist einfach eine erstaunliche Software, wenn Sie mich fragen, die als Ersatz für fast jedefor
Schleife und jedenxargs
Anruf nützlich ist .--will-cite
!Mit awk, bei dem eine
FILENAME
Variable automatisch auf den Dateinamen gesetzt wird (und, wenn GNU awk, auch mit vorhandenen Änderungen):FNR == 1 {split(FILENAME, file, ".")}
: Teilen.
Sie in der ersten Zeile jeder Datei den Dateinamen auf und speichern Sie ihn imfile
Array{gsub("example", file[1])} 1
: Ersetzen Sie für alle Zeilen durchexample
das erste Element desfile
Arrays und drucken Sie.quelle