PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Brauche ein kleines Script



axeljaeger
02-08-2002, 13:27
Ich hab eine Library mit dem hässlichen Namen "XLLib" erstellt. Jetzt ist mir ein besserer Name eingefallen, nur hab ich das Problem, das jedee Klassenname mit "XL" anfängt, alle Dateiname mit xl anfangen und am Anfang jeder header-Datei

#ifndef XL_IRGENDWAS_H
#defeine XL_IRGENDWAS_H

steht.

Ich müßte nun ein kleines Script haben, das die ganzen XL's, sowohl in den Dateien, wie auch in den Dateinamen case sensitive durch etwas anderes ersetzt.

Hoffentlich kann sich ein Perl, awk oder auch Bash-Programmierer erbarmen und sowas mal zusammenhacken, da bin ich nämlich nicht so fit.

Danke im Vorraus

tkortkamp
02-08-2002, 14:38
Hehe, danke für die Aufgabe ;) Lerne gerade Perl.

Das sollte eigentlich mit diesem Perl-Skript im aktuellen Verzeichnis funktionieren (mach aber vorher lieber ein Backup :D):


opendir(DIR, './') || die "can't opendir ./: $!";
@files = grep { /^xl/ && -f "./$_" } readdir(DIR);
closedir DIR;
@fileswoxl = @files;
#Wenn du xl in den Dateinamen mit irgendwas ersetzen möchtest dann füg das hinter
#dem s/^xl/ ein. Oder wenn in deine Dateinamen xl großgeschrieben ist ersetz einfach
#das xl mit XL.
grep(s/^xl//i, @fileswoxl);

for(1-$#fileswoxl)
{
open(OLDFILE, "<$files[$i]");
open(NEWFILE, ">$fileswoxl[$i]");

while($_ = <OLDFILE>)
{
#Strip XL
s/XL//ig; #i = case sensitive; g = global

print NEWFILE "$_";
}
close(OLDFILE);
close(NEWFILE);

#Alte Datei löschen.
system("rm -f $file[$i]");
}


Bitte sag mir dann mal ob das geklappt hat.

c ya,
Tobias

lankin
02-08-2002, 15:59
moin axel,

aenderungen im file gehen recht einfach mit sed:

sed "s/XL_/TRARA_/" <file>

oder evtl noch mir einem fuehgrenden leerzeichen.

sed "s/ XL_/ TRARA_/" <file>

bei mehrern "XL_" in einer Zeile muss noch ein
"g" angehaengt werden:

sed "s/ XL_/ TRARA_/g" <file>


das ganze koennte man jetzt einfach in einer
while- oder for-schleife auch fuer die filenamen
benutzen.

bei sed oder awk ist zu bedenken, dass das file
nicht direkt veraendert wird, dazu muesste man
auf ed/ex/vi oder c zurueckgreifen.

gruss
lankin

anda_skoa
02-08-2002, 16:20
Ich hab mir für so einen ähnlichen Zweck (anpassen der Pfade in Playlists) folgendes Script geschrieben.

replace.sh


#!/bin/bash
cat $1 | sed s/$2/$3/g > $1.bak && mv $1.bak $1


das ganze wird dann mit Find aufgerufen

#> find . -name "*.cpp" -exec {} XL XY
#> find . -name "*.cpp" -exec {} xl xy

Ciao,
_

axeljaeger
02-08-2002, 20:02
Das erste, mit Perl funktioniert so noch nicht:

/home/axel/bin/rp.pl: line 3: syntax error near unexpected token `opendir(DIR,'
/home/axel/bin/rp.pl: line 3: `opendir(DIR, './') || die "can't opendir ./: $!";

Zeile 3, weil ich noch ein /usr/bin/perl mit einer anschließenden Leerzeile davor gemacht habe.

Das Zweite mit sed funktioniert, scheint aber nicht case-sensitive zu sein.

Das letzte hab ich noch nicht ausprobiert, weil mir nicht ersichtlich war, wo in

#> find . -name "*.cpp" -exec {} XL XY

replace.sh aufgerufen wird.

tkortkamp
02-08-2002, 20:20
Hi!

Hä? Wo hast du ein /usr/bin/perl hingepackt? So sollte das aussehen und dann ein chmod +x draufmachen oder du führst das ganze einfach mit perl script.pl aus.


#!/usr/bin/perl -w

opendir(DIR, './') || die "can't opendir ./: $!";
@files = grep { /^xl/ && -f "./$_" } readdir(DIR);
closedir DIR;
@fileswoxl = @files;
#Wenn du xl in den Dateinamen mit irgendwas ersetzen möchtest dann füg das hinter
#dem s/^xl/ ein. Oder wenn in deine Dateinamen xl großgeschrieben ist ersetz einfach
#das xl mit XL.
grep(s/^xl//i, @fileswoxl);

#Sieht schöner aus so :D
for($i = 0; $i < $#fileswoxl + 1; $i++)
{
open(OLDFILE, "<$files[$i]");
open(NEWFILE, ">$fileswoxl[$i]");

while($_ = <OLDFILE> )
{
#Strip XL
s/XL//ig; #i = case sensitive; g = global

print NEWFILE "$_";
}
close(OLDFILE);
close(NEWFILE);

#Alte Datei löschen.
system("rm -f $files[$i]");
}


c ya,
Tobias

anda_skoa
02-08-2002, 22:40
Original geschrieben von axeljaeger

Das letzte hab ich noch nicht ausprobiert, weil mir nicht ersichtlich war, wo in

#> find . -name "*.cpp" -exec {} XL XY

replace.sh aufgerufen wird.

ARG! :eek:
Mein Fehler

#> find . -name "*.cpp" -exec replace.sh {} XL XY \;

Ciao,
_

axeljaeger
04-08-2002, 10:00
Das Perl-Skript funktioniert jetzt. Danke dafür