Suchen und ersetzten Script...

Bash, Shell, PHP, Python, Perl, CGI
perlitz
Posts: 202
Joined: 2003-11-01 12:25

Suchen und ersetzten Script...

Post by perlitz » 2004-08-05 18:55

Hallo,

ich versuche mich noch immer an einem Script zum anpassen von Pfadangaben (von z.B. /home/www nach srv/www/htdocs) in x files (+backup wenn was per sed ersetzt wurde).

Folgendes kleine Shell Script mag mich scheints nicht, und ich schau schon seid stunden drauf und finde den Fehler nicht... script hängt einfach ohne was zu machen :(

Code: Select all

#!/bin/bash

for file in `find . -exec grep -l "/home/www/" ;` ; do
  cp $file $file.bak
  sed `s//home/www//srv/www/htdocs/g` $file > $file.tmp
  mv $file.tmp $file
done
Hab ich nen Denkfehler? Ist das mit grep überhaupt sinnvoll (>1200 files)

In Perl bin ich leider nicht fit genug um hier eine Bedingung für das *.bak file einzubaun. Es speichert konsequent jede Datei nochmal als bak (unabhängig davon ob was ersetzt wurde oder nicht)

Code: Select all

find . -type f -name "*" -exec perl -p -i.bak -e 's//home/www//srv/www/htdocs/g' {} ;
Und hänge ich da ein grep vor, bin ich sicherlich da, wo ich schon bei dem script oben bin :( Hat jemand nen Tipp für mich, damit ich zumindest auf den richtigen weg komme?

Gruß
Andreas

wirsing
Posts: 604
Joined: 2002-11-20 21:32
Location: Vaihingen und Karlsruhe

Re: Suchen und ersetzten Script...

Post by wirsing » 2004-08-05 19:23

Warum machst du Backticks bei dem sed-Ausdruck? Ich empfehle einfache Hochkommata.

User avatar
Joe User
Project Manager
Project Manager
Posts: 11138
Joined: 2003-02-27 01:00
Location: Hamburg

Re: Suchen und ersetzten Script...

Post by Joe User » 2004-08-05 19:44

Ungetestet:

Code: Select all

for file in `grep -l -d recurse -E "(/home/www)" ./*` ; do
  perl -pi -e 's#home/www#/srv/www/htdocs#' ${file}
done
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.

perlitz
Posts: 202
Joined: 2003-11-01 12:25

Re: Suchen und ersetzten Script...

Post by perlitz » 2004-08-05 20:43

@wirsing
macht leider auch keinen unterschied, geht auch nicht :(

@Joe
ersetzt leider nicht in Unterverzeichnissen, jedoch sehr erfolgreich bei sich selbst *schmunzel* Nach dem ersten aufruf sieht der code dann so aus:

Code: Select all

#!/bin/bash
for file in `grep -l -d recurse -E "(//srv/www/htdocs)" ./*` ; do
  perl -pi -e 's#/srv/www/htdocs#/srv/www/htdocs#' ${file}
done
Wie exlude ich das script selbst (bei sich selbst soll ja mal besser nicht ersetzt werden)? Beim grep sollte ja -d recurse für dafür sorgen das auch Files aus Unterverzeicnissen berücksichtigt werden. Beim Perl teil bin ich mir nicht so sicher...

Und wie überrede ich es auch in Unterverzeichnissen zu arbeiten?

perlitz
Posts: 202
Joined: 2003-11-01 12:25

Re: Suchen und ersetzten Script...

Post by perlitz » 2004-08-13 14:53

Keiner nen Tipp? :cry:

User avatar
Joe User
Project Manager
Project Manager
Posts: 11138
Joined: 2003-02-27 01:00
Location: Hamburg

Re: Suchen und ersetzten Script...

Post by Joe User » 2004-08-13 16:02

Ersetze './*' durch '/full/path/to/dir/*' und lege das Script ausserhalb des zu bearbeitenden Pfades ab.
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.

perlitz
Posts: 202
Joined: 2003-11-01 12:25

Re: Suchen und ersetzten Script...

Post by perlitz » 2004-08-13 18:14

@Joe

nun ersetzt er nicht mehr bei sich selbst :wink: doch leider immer noch nicht in Unterverzeichnissen. Sprich nur direkt im Pfad '/full/path/to/dir/*' und in keinerlei darunter liegenden Pfaden :roll:

moodys
Posts: 6
Joined: 2004-08-11 19:05
Location: Hamburg

suchen-ersetzen

Post by moodys » 2004-08-13 22:40

ich hab mal so ein UNIVERSAL-Teil in perl zusammengeschrieben:

---------------------------------------------------------------
#!/usr/bin/perl

# search_reset.pl
# rekursives Ersetzen von Elementen in ASCII Files
# created by Karsten Butze butze@x-safe.de
# http://www.x-safe.de
#
# dem Skript werden 2 Werte übergeben: 1 Suchstring, 2 Wert Ersetzenstring
# beide Werte sind in Hochkommata zu schreiben!!!
# z.B. -> ./search_reset.pl '/etc/' '/usr/'
##########################################################################

# erster übergebener Wert
$search_string = $ARGV[0];
# zweiter übergebener Wert
$reset_string = $ARGV[1];
# das kennt Ihr ja ;-)
@files=`find ./ -type f -exec grep -l "$search_string" {} \;`;
# zeilenweise aufdröseln
foreach $filepath(@files)
{
#Zeilenumbruch entfernen
chomp($filepath);
#wenn in der Suchzeile der eigene Name NICHT auftaucht
if($filepath !~ m/$0/)
{
#Backup anlegen
`cp $filepath $filepath"_bak"`;

#öffnen (lesend)
open (READ,"< $filepath") or die "$filepath konnte nicht gelesen werden!";
#einlesen
@actual_file= <READ>;
#schließen
close READ;

# öffnen (schreibend)
open (WRITE,"> $filepath") or die "$filepath konnte nicht geschrieben werden!";
# zeilenweise parsen
foreach $_ (@actual_file)
{
#suchen,ersetzen
$_=~ s/$search_string/$reset_string/g;
#zeilenweise in File zurüchschreiben
print WRITE $_;
}
close WRITE;
}
}
# Ende und Aus
------------------------------------------------------------------------------

Moodys

Anonymous

Re: Suchen und ersetzten Script...

Post by Anonymous » 2004-08-13 23:04

alles unnötig wenn es 'rpl' (debian) bzw. replace (redhat/fedora) gibt ... :wink: