Einzel sed Befehl für mehrere Substitutionen?
-
19-09-2019 - |
Frage
Ich benutze sed Text in Dateien zu ersetzen. Ich möchte eine Datei sed geben, die in einer bestimmten Datei gesucht und ersetzt alle Fäden enthält werden.
Es geht über .h und CPP-Dateien. In jeder Datei sucht es nach Dateinamen, die in ihm enthalten sind. Wenn sie gefunden wird, ersetzt es zum Beispiel „A. h“ mit „
Das Skript ist dies:
For /F %%y in (all.txt) do
for /F %%x in (allFilesWithH.txt) do
sed -i s/\"%%x\"/"\<"%%x"\>"/ %%y
- all.txt - Liste der Dateien in ihnen um die Substitution zu tun
- allFilesWithH.txt - Alle sind Namen durchsucht werden
Ich will nicht, sed mehrmals (wie die Anzahl der Dateinamen in input.txt.) Laufen, aber ich mag einen einzigen sed Befehl auszuführen und es input.txt als Eingabe übergeben.
Wie kann ich es tun?
P. S I von VxWorks Entwicklungs Shell sed laufen, so dass er nicht über alle die Befehle, dass die Linux-Version der Fall ist.
Lösung
sed
selbst hat keine Möglichkeit Dateinamen aus einer Datei zu lesen. Ich bin nicht vertraut mit den VxWorks-Shell, und ich denke, das ist etwas, mit dem Mangel an Antworten zu tun ... Also hier sind einige Dinge, die in der Bash funktionieren würde - vielleicht wird VxWorks eines dieser Dinge unterstützen
sed -i 's/.../...' `cat all.txt`
sed -i 's/.../...' $(cat all.txt)
cat all.txt | xargs sed -i 's/.../...'
Und wirklich, es ist keine große Sache zu invoke sed
mehrmals, wenn es bekommt den Job getan:
cat all.txt | while read file; do sed -i 's/.../.../' $file; done
for file in $(cat all.txt); do # or `cat all.txt`
sed -i 's/.../.../' $file
done
Andere Tipps
Sie können eine der Schleifen beseitigen, so sed
muss nur einmal pro Datei aufgerufen werden. Verwenden
die -f
Option mehr als eine Substitution zu spezifizieren:
For /F %%y in (all.txt) do
sed -i -f allFilesWithHAsSedScript.sed %%y
allFilesWithHAsSedScript.sed
ergibt sich aus allFilesWithH.txt
und würde enthalten:
s/\"file1\"/"\<"file1"\>"/
s/\"file2\"/"\<"file2"\>"/
s/\"file3\"/"\<"file3"\>"/
s/\"file4\"/"\<"file4"\>"/
(Im Artikel Common Threads: Sed mit gutem Beispiel Teil 3 gibt es viele Beispiele von sed-Skripten mit Erklärungen.)
Nicht verwirren lassen (Wortspiel beabsichtigt).
Was ich tun würde, ist die Veränderung allFilesWithH.txt in einen sed Befehl sed verwendet wird.
(Wenn gezwungen verwenden sed. Ich eigentlich Perl stattdessen verwenden würde, kann es auch für * .h Dateien die Suche.)