Hallo Liste, wie kann ich mit Hilfe eines bash-skriptes in einem Verzeichnis das Dateien in mehreren Unterverzeichnissen enthält, immer das gleiche Wort in diesen Dateien durch ein anderes erstzen? Zum Beispiel soll "Tastatur" in allen Dateien durch "Keyboard" ersetzt werden. Gruß, Markus.
Hi,
wie kann ich mit Hilfe eines bash-skriptes in einem Verzeichnis das Dateien in mehreren Unterverzeichnissen enthält, immer das gleiche Wort in diesen Dateien durch ein anderes erstzen? Zum Beispiel soll "Tastatur" in allen Dateien durch "Keyboard" ersetzt werden.
man sed for i in /verzeichnis/datei* do ... done Viele Grüße, Stefan
Moin Moin, Am Sonntag, 25. November 2001 13:04 schrieb Stefan Gofferje:
wie kann ich mit Hilfe eines bash-skriptes in einem Verzeichnis das Dateien in mehreren Unterverzeichnissen enthält, immer das gleiche Wort in diesen Dateien durch ein anderes erstzen? Zum Beispiel soll "Tastatur" in allen Dateien durch "Keyboard" ersetzt werden.
Habe zwar keinen Rat für die bash, aber perl -p -e 's/ALT/NEU/' *.dat Macht das recht schnell;) Ciao Andre
Andre Heine wrote (Sonntag, 25. November 2001 15:09):
Am Sonntag, 25. November 2001 13:04 schrieb Stefan Gofferje:
wie kann ich mit Hilfe eines bash-skriptes in einem Verzeichnis das Dateien in mehreren Unterverzeichnissen enthält, immer das gleiche Wort in diesen Dateien durch ein anderes erstzen? Zum Beispiel soll "Tastatur" in allen Dateien durch "Keyboard" ersetzt werden.
Habe zwar keinen Rat für die bash, aber
perl -p -e 's/ALT/NEU/' *.dat
Macht das recht schnell;)
Aber nur im aktuellen Verzeichnis, nicht in den Unterverzeichnisen. Thomas.
Thomas Hofer wrote:
Habe zwar keinen Rat für die bash, aber
perl -p -e 's/ALT/NEU/' *.dat
Macht das recht schnell;)
Aber nur im aktuellen Verzeichnis, nicht in den Unterverzeichnisen.
Ja, Du hast recht. Habe ich wohl überlesen;( Geht aber auch, vielleicht nicht mit einer Zeile. Bye Andre
* Markus Nohn schrieb am 25.Nov.2001:
wie kann ich mit Hilfe eines bash-skriptes in einem Verzeichnis das Dateien in mehreren Unterverzeichnissen enthält, immer das gleiche Wort in diesen Dateien durch ein anderes erstzen? Zum Beispiel soll "Tastatur" in allen Dateien durch "Keyboard" ersetzt werden.
find . <weitere Options> -exec sed "s/Tastatur/Keyboard/g" Anstelle von Tastatur kann ein regulärer Ausdruck stehen, dadurch sind eine Menge mehr Ersetzungsmöglichkeiten gegeben. Mit weitere Options kann man die Dateien einschränken, etwa bestimmte Namen, oder Alter, Größe usw. man find man sed Bernd -- Was ist quoten? Quoten ist das Zitieren aus einer mail, der man antwortet. Und wie macht man es richtig? Zitate werden mit "> " gekennzeichnet. Nicht mehr als nötig zitieren. Vor den Abschnitten das Zitat, auf das man sich bezieht, mit einer Zeile Abstand oben und unten. |Zufallssignatur 12
Bernd Brodesser wrote (Sonntag, 25. November 2001 17:35):
* Markus Nohn schrieb am 25.Nov.2001:
wie kann ich mit Hilfe eines bash-skriptes in einem Verzeichnis das Dateien in mehreren Unterverzeichnissen enthält, immer das gleiche Wort in diesen Dateien durch ein anderes erstzen? Zum Beispiel soll "Tastatur" in allen Dateien durch "Keyboard" ersetzt werden.
find . <weitere Options> -exec sed "s/Tastatur/Keyboard/g"
Da fehlen aber zwei Dinge: ein exec in einem find muß mit einem \; abgeschlossen werden. Zweitens muß sed der Dateiname übergeben werden, was im exec durch den Ausdruck {} möglich ist. Das Problem ist nun, daß man mit sed eine Datei nicht direkt verändern kann, sodaß man eine temporäre Datei benötigt. Wenn man ein sed und ein mv im exec unterbringen will, kann man das über eine sub-bash machen (ungetestet): find . -exec bash -c "sed 's/Tastatur/Keyboard/g' \ <$0 >/tmp/replace.$$ && mv /tmp/replace.$$ $0'" {} \; Es geht auch mit einer for-Schleife, was vielleicht etwas verständlicher ist, aber bei Spaces in Filenames versagt: for f in `find .`; do sed 's/Tastatur/Keyboard/g' \ <$f >/tmp/replace.$$ && mv /tmp/replace.$$ $f ; done Grüße, Thomas.
* Thomas Hofer schrieb am 25.Nov.2001:
Bernd Brodesser wrote (Sonntag, 25. November 2001 17:35):
* Markus Nohn schrieb am 25.Nov.2001:
wie kann ich mit Hilfe eines bash-skriptes in einem Verzeichnis das Dateien in mehreren Unterverzeichnissen enthält, immer das gleiche Wort in diesen Dateien durch ein anderes erstzen? Zum Beispiel soll "Tastatur" in allen Dateien durch "Keyboard" ersetzt werden.
find . <weitere Options> -exec sed "s/Tastatur/Keyboard/g"
Da fehlen aber zwei Dinge: ein exec in einem find muß mit einem \; abgeschlossen werden. Zweitens muß sed der Dateiname übergeben werden, was im exec durch den Ausdruck {} möglich ist. Das Problem ist nun, daß man mit sed eine Datei nicht direkt verändern kann, sodaß man eine temporäre Datei benötigt. Wenn man ein sed und ein mv im exec unterbringen will, kann man das über eine sub-bash machen (ungetestet):
find . -exec bash -c "sed 's/Tastatur/Keyboard/g' \ <$0 >/tmp/replace.$$ && mv /tmp/replace.$$ $0'" {} \;
Es geht auch mit einer for-Schleife, was vielleicht etwas verständlicher ist, aber bei Spaces in Filenames versagt:
for f in `find .`; do sed 's/Tastatur/Keyboard/g' \ <$f >/tmp/replace.$$ && mv /tmp/replace.$$ $f ; done
Hallo Thomas, Du hast natürlich Recht. Bernd -- Umsteiger von Microsoft Windows xx? Hast Du schon file://usr/doc/howto/de/DE-DOS-nach-Linux-HOWTO.txt gelesen? Auch file://usr/doc/Books/Linuxhandbuch.dvi ist zu empfehlen. |Zufallssignatur 1
Bernd Brodesser wrote (Sonntag, 25. November 2001 21:04):
Du hast natürlich Recht.
Naja, nicht ganz - das Quoting hier ist falsch: find . -exec bash -c "sed 's/Tastatur/Keyboard/g' \ <$0 >/tmp/replace.$$ && mv /tmp/replace.$$ $0'" {} \; So sollte es besser sein (ungetestet): find . -exec bash -c 'sed "s/Tastatur/Keyboard/g" \ <$0 >/tmp/replace.$$ && mv /tmp/replace.$$ $0' {} \; Grüße, Thomas.
Hi Thomas, On 2001-11-25 19:48 GMT, Thomas Hofer
Es geht auch mit einer for-Schleife, was vielleicht etwas verständlicher ist, aber bei Spaces in Filenames versagt:
for f in `find .`; do sed 's/Tastatur/Keyboard/g' \ <$f >/tmp/replace.$$ && mv /tmp/replace.$$ $f ; done
Was ist mit for f in "`find .`"; do ...?
--
Ralf Cirksena
Ralf Cirksena wrote (Montag, 26. November 2001 09:57):
Hi Thomas,
On 2001-11-25 19:48 GMT, Thomas Hofer
wrote: Es geht auch mit einer for-Schleife, was vielleicht etwas verständlicher ist, aber bei Spaces in Filenames versagt:
for f in `find .`; do sed 's/Tastatur/Keyboard/g' \ <$f >/tmp/replace.$$ && mv /tmp/replace.$$ $f ; done
Was ist mit for f in "`find .`"; do ...?
Das bringt nichts. Durch die doppelten Quotes wird der ganze Output der Backticks auf einmal in f gepackt (es gibt also nur einen Schleifendurchlauf). Vielleicht hast du probehalber so etwas probiert: for f in "`...`";do echo $f;done ...und das hat dann vielleicht so etwas ausgegeben: a b b c d Das sieht zwar richtig aus, jedoch gibt es nur *einen* Schleifendurchlauf, nicht 4, und die Newlines sind alle in f enthalten! (Gib einmal bei jedem Schleifendurchlauf einen Zähler mit aus, dann wirst du das sehen.) Wenn man jetzt, sagen wir mal, mit dieser Methode alle Dateien mit cat ausgeben wollte, passiert folgendes: cat $f expandiert im ersten Durchlauf zu cat "a" "b" "b" "c" "d" ...und damit verlieren wir erst wieder die Quotes um "b b". Die Alternative cat "$f" expandiert dagegen zu cat "a b b c d", was noch weniger sinnvoll ist, da kein File namens "a b b c d" existiert. Mit Quotes allein kommt man hier also nicht weiter. Man kann die Probleme aber ganz leicht mit der Variable IFS (Internal Field Separator) umgehen, die definiert, welche Zeichen Wörter begrenzen. IFS ist normalerweise auf $' \t\n' gesetzt, was bedeutet, daß ein Wort von einem Space, einem Tabulator oder einem Newline begrenzt wird. (Die Quotes $'' bedeuten, daß \t und ähnliches als die jeweiligen Sonderzeichen interpretiert werden) Die Lösung ist nun, einfach vorübergehend das Space aus dem IFS zu nehmen: (IFS=$'\t\n';for f in `...`;do somethingwith $f;done) Der Backtick-Operator liefert (gemäß des vorigen Beispiels) "a\nb b\nc\nd\n" - jetzt werden aber nur noch die \n als Feldbegrenzer angesehen, das Space in "b b" aber nicht mehr, und der String wird im for so geparst: "a" "b b" "c" "d". Die runden Klammern bewirken, daß der Ausdruck in einer sub-Shell ausgeführt wird, wodurch der originale Wert von IFS auf der Ursprungs-Shell erhalten bleibt. Thomas.
18:27Moin Thomas, * Thomas Hofer schrieb am 25 Nov 2001:
Bernd Brodesser wrote (Sonntag, 25. November 2001 17:35):
* Markus Nohn schrieb am 25.Nov.2001:
wie kann ich mit Hilfe eines bash-skriptes in einem Verzeichnis das Dateien in mehreren Unterverzeichnissen enthält, immer das gleiche Wort in diesen Dateien durch ein anderes erstzen? Zum Beispiel soll "Tastatur" in allen Dateien durch "Keyboard" ersetzt werden.
find . <weitere Options> -exec sed "s/Tastatur/Keyboard/g"
Es geht auch mit einer for-Schleife, was vielleicht etwas verständlicher ist, aber bei Spaces in Filenames versagt:
for f in `find .`; do sed 's/Tastatur/Keyboard/g' \ <$f >/tmp/replace.$$ && mv /tmp/replace.$$ $f ; done
IFS=' ' for ... usw geht dann auch mit Leerzeichen, aber dafür nicht mit Zeilenwechsel im Dateinamen *g* Gruß, Sebastian -- Do not meddle in the affairs of Wizards, for they are subtle and quick to anger. Sebastian Helms - http://www.helms.sh - mailto:mail@helms.sh (PGP welcome) SuSE-Linux-Mailinglisten-FAQ: http://www.helms.sh/faq/
Download8188Age (days ago)8189Last active (days ago)
11 comments7 participantsparticipants (7)
Andre Heine B.Brodesser@t-online.de Markus Nohn Ralf Cirksena Sebastian Helms Stefan Gofferje Thomas Hofer