PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : perl expression



opino
09.11.2006, 23:01
folgendes beispiel stammt von der rename manpage:

rename 's/\.bak$//' *.bak

ich verstehe die Per expression nicht.

s/ soll sicherlich suchen sein.
was bedeutet \.bak
was macht die variable dort?
was bedeuten die zwei \\ am ende?

wie muss die Expression lauten wenn ich die dateien v1.txt v2.txt v3.txt in l1.txt l2.txt und l3.txt umbennenen will.

Xanti
09.11.2006, 23:07
s bedeutet suche und ersetze, in der Art:


s/muster/replace/

\.bak$ bedeutet: matche alles, was mit .bak endet. Der Punkt hat in den reg. exp. eine besondere Bedeutung und muss deshalb escaped werden. $ bezeichnet keine Variable, sondern das Ende des Strings. Es werden also .bak am Ende der Filenamen abgeschnitten.

Gruss, Xanti

edit: Bez. Deiner Rename-Anfrage müsste der reg. Ausdruck : 's/^v/|/' lauten. Aber im Ernst, Du willst doch nicht etwa eine Pipe in die Filenamen friemeln?

opino
09.11.2006, 23:18
Aber im Ernst, Du willst doch nicht etwa eine Pipe in die Filenamen friemeln?

danke für die schnelle antwort.

ehrlich gesagt weiss ich nicht wie man es am elegantesten löst.
Ich wollte einen einzeiler machen da dachte ich mit rename.
ich habe noch diese möglichkeit mit for schleife gefunden aber da sind auch auch perl ausdrücke drin deswegen fragte ich was die bedeuten.

Also neme ich an for schleife ist besser?

Xanti
09.11.2006, 23:31
Keine Ahnung, was da besser ist, da ich nicht weiss, was Du machen willst.

opino
09.11.2006, 23:39
also ich bin gerade total am verzweifeln.
mein problem: ich habe dateien
versuch1.txt
versuch2.txt
versuch3.txt
versuch4.txt

daraus soll werden
latex_tb_1.tex
latex_tb_2.tex
latex_tb_3.tex

Ich verstehe das mit den Wildcards bei rename nicht.
Warum geht nicht rename versuch*.txt latex_tb*.tex?

Bitte sag nich das ist ein anfänger fehler, das hatte ich heute schon.

Jabo
10.11.2006, 00:34
Ich verstehe das mit den Wildcards bei rename nicht.
Warum geht nicht rename versuch*.txt latex_tb*.tex?

Hallo,

beim rot eingefärbten Stern ist in dem Befehl nicht klar, was hin soll, das könnte sonstwas sein, du willst aber eine konkrete Zahl.

Ich würde in Perl alle txt-Namen in ein Array packen, in einer Schleife die Nummer hochzählen und dabei den jeweiligen Tex-Namen ausgeben. Ist ja total schematisch auf beiden Seiten, nur die Nummer ändert sich.

[Edit]
Zu regulären Ausdrücken:

http://de.selfhtml.org/perl/sprache/regexpr.htm

Überhaupt ist die Perl-Einführung von Selfhtml eine lesenswerte Sache.

Wolfgang
10.11.2006, 08:28
Hallo
Das geht sogar viel schneller und eleganter mit der Shell, wenn du Bash oder Ksh benutzt.


for i in $(seq 4); do mv versuch${i}.txt latex_tb_${i}.tex ;done


Gruß Wolfgang

Xanti
10.11.2006, 09:17
...
versuch1.txt
versuch2.txt
versuch3.txt
versuch4.txt

daraus soll werden
latex_tb_1.tex
latex_tb_2.tex
latex_tb_3.tex

...

<Dummschwätz>
Deine Abbildung ist nicht injektiv. ;)
</Dummschwätz>

Auch wenn Wolfgang bereits eine Lösung präsentiert hat, will ich noch die Möglichkeit mit rename angeben:



rename 's/^versuch(\d+).txt/latex_tb_$1.tex/' versuch*.txt


Gruss, Xanti