# Dateiübergreifendes ersetzen von Wörtern



## xtratz (30. September 2005)

Hallo Leute,

ich müsste in einem Verzeichnis bei ca. 200 Textdateien, in jeder Datei ein bestimmets Wort austauschen.

Kann ich das irgendwie über einen Konsolenbefehl Managen oder muss ich jede Datei einzeln öffnen ?!.

Gruss


----------



## deepthroat (30. September 2005)

Hi.

Das kannst du natürlich ganz schnell mit einem Shell-Skript erledigen:
Bash:

```
for i in <DATEIEN>; do
  sed -e 's,<WORT>,<ERSATZ>,g' "$i" > "$i.tmp" && mv -f "$i.tmp" "$i"
done
```

<DATEIEN> sind die Dateien in denen du die Ersetzung vornehmen willst (z.B. *.txt oder a*.doc)
<WORT> ist das Wort was du ersetzen willst (Spezialzeichen solltest du mit einem Backslash zitieren)
<ERSATZ> bezeichnet das Ersatzwort

Wenn du erstmal ausprobieren willst, was überhaupt ersetzt wird, ersetze erstmal die sed-Zeile oben durch

```
sed -ne 's,<WORT>,<ERSATZ>,gp' "$i"
```


----------



## xtratz (30. September 2005)

Ich danke Dir.

Allerdings erhalte ich eine Fehlermeldung:



> 'root/ersetzen.sh: line 1: syntax error near unexpected token `do
> 'root/ersetzen.sh: line 1: `for i in /root/test/*.php; do



Die Datei sieht so aus:



> for i in /root/test/*.php; do
> sed -e 's,$HTTP_GET_VARS,$_GET,g' "$i" > "$i.tmp" && mv -f "$i.tmp" "$i"
> done



Wo liegt der Hund begraben ?!.

Gruss und Danke.


----------



## deepthroat (30. September 2005)

Mit welcher Shell führst du denn das Skript aus? Du verwendest doch nicht etwa die (t)csh, oder?

Am besten ist es den Interpreter in der ersten Zeile eines Skripts nach dem sogenannten Shebang anzugeben.


```
#!/bin/sh

for i ...
```


----------



## xtratz (30. September 2005)

Ja danke das hat jetzt geklappt.

Eine Frage noch, geht das auch irgendwie für Unterordner.
Sodass wirklich alle Dateien und Unterordner mit geändert werden ?!

Gruss


----------



## deepthroat (1. Oktober 2005)

Ja, das Skript kann man auch für Unterordner erweitern:

```
#!/bin/sh

if [ $# -ne 2 ]; then
  echo "usage: $0 <DIR> <PATTERN>" >&2
  exit 1
fi

# /edit: variable "line" sollte "i" heißen  :-( 
find "$1" -name "$2" | while read i; do
  if [ -e "$i.tmp" ]; then
    echo "$0: temp file already exists, not overwriting: $i.tmp" >&2
  else
    sed -e 's,$HTTP_GET_VARS,$_GET,g' "$i" > "$i.tmp" && mv -f "$i.tmp" "$i"
  fi
done
```

Aufrufen kannst du das Skript dann z.B. so:
	
	
	



```
./ersetze_GET.sh /foo/bar '*.php'
```

Das Skript muß jetzt mit 2 Parametern aufgerufen werden, dem Verzeichnis in dem alle Dateien rekursiv bearbeitet werden sollen und dann das Muster mit dem die Dateien übereinstimmen müssen.

Außerdem wird die Ersetzung nur durchgeführt wenn nicht bereits eine temporäre Datei existiert damit keine Dateien verloren gehen können.


----------

