Suchen/Ersetzen von der Konsole

Bash, Shell, PHP, Python, Perl, CGI
Post Reply
fuchsmi
Posts: 44
Joined: 2003-02-27 10:11
 

Suchen/Ersetzen von der Konsole

Post by fuchsmi »

Hi!
Ich habe einen Ordner mit ca. 100 html dateinen.

ich möchte nun eine Search/Replace über den gesammten HTML-Code fahren.

Soweit ich weiß kann man das mit einer Zeile von der Konsole aus machen.
Bitte um ein Beispiel!

Danke Michi
captaincrunch
Userprojekt
Userprojekt
Posts: 7066
Joined: 2002-10-09 14:30
Location: Dorsten
Contact:
 

Re: Suchen/Ersetzen von der Konsole

Post by captaincrunch »

Wenn du ncht genau sagst, was du machen willst, kann ich dir nur info sed ans Herz legen
DebianHowTo
echo "[q]sa[ln0=aln256%Pln256/snlbx]sb729901041524823122snlbxq"|dc
fuchsmi
Posts: 44
Joined: 2003-02-27 10:11
 

Re: Suchen/Ersetzen von der Konsole

Post by fuchsmi »

ich möchte in allen dateien im ordern /hugo
den text max@muster.de
auf max@muster.com
äamdern.
kase
Posts: 1031
Joined: 2002-10-14 22:56
 

Re: Suchen/Ersetzen von der Konsole

Post by kase »

jop, für sowas ist sed dein Freund.´

man sed oder info sed für mehr Infos.
jamesb
Posts: 661
Joined: 2002-05-08 15:35
Location: Karlsruhe
Contact:
 

Re: Suchen/Ersetzen von der Konsole

Post by jamesb »

Schau mal da: http://www.einzeiler.de

JamesB
bolle
Posts: 34
Joined: 2003-01-20 18:25
 

Re: Suchen/Ersetzen von der Konsole

Post by bolle »

Ich häng mich mal rein.
Ich würde sowas auch gebrauchen, aber global in einem grossen Verzeichniss mit unterverzeichnissen. In ca. 12000 Dateinen muss der absolute Pfad geändert werden.
Num bräuchte ich mal ein Beispiel, wie ich in allen Dateien und dateien in unterverzeichnissen den pfad /home/www/web2/ nach /home/user/html/ ändere.
dodolin
Posts: 3840
Joined: 2003-01-21 01:59
Location: Sinsheim/Karlsruhe
Contact:
 

Re: Suchen/Ersetzen von der Konsole

Post by dodolin »

bolle
Posts: 34
Joined: 2003-01-20 18:25
 

Re: Suchen/Ersetzen von der Konsole

Post by bolle »

Ich kenn die Linuxfibel...so schlau war ich auch schon.
Das Problem ist, wenn ich mich nach der anleitung richte, kann ich eine Datei damit editieren. Ich hätte aber gerne 12000 Dateien unterschiedlichen Types in verschiedenen Verzeichnissen mit Unterverzeichnissen auch verschiedener Namen in einem rutsch geändert.
Falls das mit sed geht, hätte ich gerne, wie oben schon drum gebeten ein beispiel, nicht irgendwelche Links zu sed manuals.
Falls das so, wie ich das brauche nicht möglich ist, reicht ein einfaches Nein, geht nicht und ich pack den ganzen krempel in ein tar Archiv, lade es runter und editier das nach herkömmlicher Art mit suchen und ersetzen in nem Batchvorgang.
majortermi
Userprojekt
Userprojekt
Posts: 916
Joined: 2002-06-17 16:09
 

Re: Suchen/Ersetzen von der Konsole

Post by majortermi »

Dann lass doch einfach eine Schleife laufen:

Code: Select all

for filename in `find /pfad/zum/verzeichnis -type f`
do
  sed "/suche/ersetze/" $filename > $filenmae
done
Erst nachlesen, dann nachdenken, dann nachfragen... :)
Warum man sich an diese Reihenfolge halten sollte...
cruz-r
Posts: 8
Joined: 2002-07-14 12:30
Location: Dortmund
 

Re: Suchen/Ersetzen von der Konsole

Post by cruz-r »

STOP !

Wenn die oben beschriebene Schleife so umgesetzt wird, werden alle betroffenen Dateien auf 0 Bytes gesetzt !

Besser:

Code: Select all

for filename in $(find /pfad/zum/verzeichnis -type f)
do
  sed 's/suche/ersetze/g' $filename > $$
  mv $$ $filename
done
Gruss
cruz-r

P.S. Seh grad, dass die zweite Angabe der Variable einen typo enthält. Wär also zum Glück nichts passiert, ausser einem Haufen Fehlermeldungen (ambiguous redirect)

P.P.S. Nicht wundern, hab noch ein paar Kleinigkeiten verändert
dodolin
Posts: 3840
Joined: 2003-01-21 01:59
Location: Sinsheim/Karlsruhe
Contact:
 

Re: Suchen/Ersetzen von der Konsole

Post by dodolin »

Das Problem ist, wenn ich mich nach der anleitung richte, kann ich eine Datei damit editieren. Ich hätte aber gerne 12000 Dateien unterschiedlichen Types in verschiedenen Verzeichnissen mit Unterverzeichnissen auch verschiedener Namen in einem rutsch geändert.
Sorry, aber ich dachte, es wäre klar, dass man dann statt

sed 's/altes Muster/neues Muster/' datei

wie im Beispiel einfach die Shellexpansion nutzt und z.B.

sed 's/altes Muster/neues Muster/' *

schreibt, um alle Dateien im aktuellen Verzeichnis zu ändern.
Ebenso könnte man ein geschicktes `ls ...` statts dem Stern einbauen, um noch mehr Dateien zu erwischen. Schliesslich sagt ja auch schon die manpage von sed

Code: Select all

NAME
       sed - a Stream EDitor

SYNOPSIS
       sed [-n] [-V] [--quiet] [--silent] [--version] [--help]
           [-e script] [--expression=script]
           [-f script-file] [--file=script-file]
           [script-if-no-other-script]
           [file...]
Man beachte die Punkte, nach dem "file"...
Diese bedeuten, dass man auch mehrere Dateinnamen angeben kann.
jamesb
Posts: 661
Joined: 2002-05-08 15:35
Location: Karlsruhe
Contact:
 

Re: Suchen/Ersetzen von der Konsole

Post by jamesb »

Code: Select all

find . -type f -name "*.html" -exec perl -p -i -e 's/altessWort/neuessWort/g' {} ;
... und das war's auch schon...

JamesB
dodolin
Posts: 3840
Joined: 2003-01-21 01:59
Location: Sinsheim/Karlsruhe
Contact:
 

Re: Suchen/Ersetzen von der Konsole

Post by dodolin »

Code: Select all

find . -type f -name "*.html" -exec perl -p -i -e 's/altessWort/neuessWort/g' {} ;
Ah, siehste, der macht auch sed.

Code: Select all

's/altessWort/neuessWort/g'
find kenne ich nicht so, aber das könnte ich mir dann für meine Lösung ja auch gleich ausborgen...

Code: Select all

sed 's/altes Muster/neues Muster/' `find . -type f -name "*.html"`
:-D
webdienstleistungen
Posts: 59
Joined: 2003-01-04 21:42
Location: Dreieich
Contact:
 

Re: Suchen/Ersetzen von der Konsole

Post by webdienstleistungen »

Ich möchte im Ordner /var/www/web1/html/startrekvoyager alle Dateien und Dateien in Unterverzeichnissen, die die Zeichenkette /home/www/web2/html/ enthalten mit dieser /var/www/web1/html/ ersetzen.

Ich habe folgendes Script geschrieben:

Code: Select all

#! /bin/sh
for filename in $(find /var/www/web1/html/startrekvoyager -type f)
do
sed 's//home/www/web2/html///var/www/web1/html//' $filename > $$
mv $$ $filename
done
Aber anscheinend stimmt es nicht.
captaincrunch
Userprojekt
Userprojekt
Posts: 7066
Joined: 2002-10-09 14:30
Location: Dorsten
Contact:
 

Re: Suchen/Ersetzen von der Konsole

Post by captaincrunch »

Du markierst die "/" in den Pfadnamen auch nicht beim sed-Aufruf, ist klar, dass das in die Hose geht.
Alternativ könntest du den sed andere Trennzeichen nutzen lassen.
DebianHowTo
echo "[q]sa[ln0=aln256%Pln256/snlbx]sb729901041524823122snlbxq"|dc
webdienstleistungen
Posts: 59
Joined: 2003-01-04 21:42
Location: Dreieich
Contact:
 

Re: Suchen/Ersetzen von der Konsole

Post by webdienstleistungen »

Ich habe es jetzt so gemacht:
#! /bin/sh
for filename in $(find /var/www/web1/html/startrekvoyager -type f)
do
sed 's//home/www/web2/html///var/www/web1/html//' $filename > $$
mv $$ $filename
done
Abgesehen davon, dass jetzt sämtliche, tausende von Dateien im Ordner /var/www/web1/html/startrekvoyager 0 Byte groß sind hat alles geklappt.
Vielleicht noch eine Idee?
captaincrunch
Userprojekt
Userprojekt
Posts: 7066
Joined: 2002-10-09 14:30
Location: Dorsten
Contact:
 

Re: Suchen/Ersetzen von der Konsole

Post by captaincrunch »

Arbeite beim find mal mit der Option "size", dann geht auch das
DebianHowTo
echo "[q]sa[ln0=aln256%Pln256/snlbx]sb729901041524823122snlbxq"|dc
oxygen
Posts: 2138
Joined: 2002-12-15 00:10
Location: Bergheim
 

Re: Suchen/Ersetzen von der Konsole

Post by oxygen »

besser xargs benutzen. Schleifen = evil, das weiß sogar ein BASIC Programmierer.
webdienstleistungen
Posts: 59
Joined: 2003-01-04 21:42
Location: Dreieich
Contact:
 

Re: Suchen/Ersetzen von der Konsole

Post by webdienstleistungen »

Kannst du mir mal ein Beispiel mit xargs geben?
webdienstleistungen
Posts: 59
Joined: 2003-01-04 21:42
Location: Dreieich
Contact:
 

Re: Suchen/Ersetzen von der Konsole

Post by webdienstleistungen »

Ich habe es mal mit dem Tipp von http://www.einzeiler.de probiert:

find . -type f -name "*.*" -exec perl -e 's/home/www/web2/var/www/web1//g' {} ;

Es geht jedoch auch nicht.
Kann mir jemand sagen, was ich falsch mache.
Post Reply