Hallo Markus, Markus Assfalg schrieb am 26.03.02, 08:55:44:
ich moechte den Inhalt von Dateien immer nach dem gleichen Schema modifizieren (mit sed). Folgende Eingabe gibt mir eine Liste mit den Dateien. Wie kann ich nun jede einzelnen Zeile der Reihe nach abarbeiten ?
user@host:~> find . -name Root | grep "CVS/Root" [...]
Eine von wahrscheinlich hunderttausend möglichen Lösungen mit folgender Scriptdatei (ungetestet!): ---------------------- # !/bin/sh ModifyFile() { while read Filename do sed -e "s/Needle/Replace/g" ${Filename} done } find . -name Root | grep "CVS/Root" | ModifyFile ----------------------- Gruß Raimund
Hallo, On Tue, 26 Mar 2002, Raimund Hölle wrote:
Markus Assfalg schrieb am 26.03.02, 08:55:44:
ich moechte den Inhalt von Dateien immer nach dem gleichen Schema modifizieren (mit sed). Folgende Eingabe gibt mir eine Liste mit den Dateien. Wie kann ich nun jede einzelnen Zeile der Reihe nach abarbeiten ?
user@host:~> find . -name Root | grep "CVS/Root" [...]
Eine von wahrscheinlich hunderttausend möglichen Lösungen mit folgender Scriptdatei (ungetestet!):
---------------------- # !/bin/sh
ModifyFile() { while read Filename do sed -e "s/Needle/Replace/g" ${Filename} done }
find . -name Root | grep "CVS/Root" | ModifyFile
"Besser": find . -type -d -name "CVS" -exec ls "{}/Root" 2>/dev/null\; \ | while read f; do \ sed -e 's/Needle/Haystack/g' "$f" > "${f}.new"; \ done Warum "besser"? Pipes + grep ist lahm... Und ob die Pipe in eine Funktion klappt? Meine Version geht jedenfalls auch direkt von der Kommandozeile aus, was schonmal ein Vorteil ist ;) Das 2>/dev/null dient nur "kosmetischen" Zwecken falls 'CVS/Root' nicht existiert... Achso, ja, das ist (mit echo sed ... statt nem echten sed-Befehl) getestet. Ausgabe mit: while read f; do echo "sed 's/foo/bar/' < '$f'"; done liefert z.B.: sed 's/foo/bar/' < '.../lib/CVS/Root' sed 's/foo/bar/' < '.../src/CVS/Root' Wenn man also den sed-Befehl und die Ausgabe anpasst muesste es klappen. Da man in die "while .. do .. done"-Schleife auch noch mehr reinschreiben kann sollte also z.B. folgendes gehen: while read f; \ do \ cp "$f" "${f}.bak"; \ sed 's/foo/bar/g' < "${f}.bak" > "$f"; \ done Weitere Infos finden sich u.a. in 'man bash' und 'man sed'. -dnh PS: ja, ich weiss, dass ; \<Zeilenumbruch> redundant ist, aber in dieser Schreibweise ist ein Copy & Paste in ne shell/xterm moeglich. -- "Wer fleissig ist , ist nur zu faul nichts zu tun." [Woko° in dag°]
participants (2)
-
David Haller
-
Raimund Hölle