PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : tcsh :s/old/new/



DanielDD
06-04-2010, 15:40
Hallo Leute,

ich will in einem Tcsh-script mittels



:s/old/new/

substitutieren. Der String new ist jedoch beim Erstellen des scriptes nicht
bekannt, denn new soll der erste Parameter des scriptes sein.
Wie bekomme ich das hin? Ich bräuchte so etwas wie



:s/old/$1/

Dann wird aber old durch $1 und nicht durch den ersten Parameter ersetzt.
Wie bekomme ich das hin?

Daniel

bischi
06-04-2010, 15:58
Ungetestet:


":s/old/"$1"/"

MfG Bischi

DanielDD
06-04-2010, 16:40
Hallo Bischi,

das geht noch nicht ganz. Das script rtest (Minimalbeispiel) sieht jetzt so aus:


#!/bin/tcsh
foreach filename (`ls *JPG`)
set f = $filename":s/P/"$1"/"
echo $filename $f
mv $filename $f
end


Im aktuellen Verzeichnis ist nur eine Datei PC050005.JPG.
Der Aufruf rtest xxx liefert:


localhost:~/t$ rtest xxx
PC050005.JPG PC050005.JPG:s/P/xxx/
mv: cannot move `PC050005.JPG' to `PC050005.JPG:s/P/xxx/': No such file or directory
Exit 1


Daniel

bischi
07-04-2010, 08:29
Wie sähe denn dein Aufruf ohne Script für eine Datei aus? Bzw - existiert der Ordner xxx? ;)

MfG Bischi

DanielDD
07-04-2010, 10:58
Wie sähe denn dein Aufruf ohne Script für eine Datei aus?


Wenn ich das ganze für eine Datei von der Kommandozeile aus mache, dann
kann ich auf die ganzen Substitutionen verzichten:


mv PC050005.JPG xxxC050005.JPG


Bzw - existiert der Ordner xxx? ;)


Im aktuellen Verzeichnis gibt es keine Unterverzeichnisse. Wenn ich aber
Unterverzeichnisse PC050005.JPG:s/P/xxx/ anlege, dann bewegt das script
die Datei PC050005.JPG in dieses Verzeichnis.

:) Aber wenn ich die Sache bedenke: Es läuft wieder einmal darauf hinaus,
Kopfstände und Klimmzüge zu machen, um ein banales Problem zu lösen.
Es geht hier um irgendwelche Feinheiten bei der Behandlung von Substitutionen
durch die tcsh.

Das eigentliche Problem besteht darin, bei allen Bilddateien im Verzeichnis das P im
Dateinamen durch eine Jahreszahl zu ersetzen. Diese Jahreszahl wollte ich als
Parameter übergeben. Da aber nur die Jahreszahlen 2004 bis 2010 vorkommen,
kann ich einfach 7 scripte schreiben, und das Problem ist gelöst.......

MfG, Daniel

bischi
07-04-2010, 13:48
Ohne die tcsh jetzt im Detail zu kennen:

die mv Synthax sieht wie auf der Bash aus. Und


PC050005.JPG:s/P/xxx/

sieht für mich nicht wie ein gültiger Ordnernamen aus... Oder hab ich da was falsch verstanden?

MfG Bischi

PS: Funktioniert folgendes? Mit oder ohne erstelltem Ordner?



#!/bin/tcsh
foreach filename (`ls *JPG`)
set f = "/P/"$1"/"$filename
echo $filename $f
mv $filename $f
end

DanielDD
07-04-2010, 14:03
PC050005.JPG:s/P/xxx/

sieht für mich nicht wie ein gültiger Ordnernamen aus... Oder hab ich da was falsch verstanden?

Ich hatte zu Testzwecken ein Verzeichnis PC050005.JPG:s, darin ein Verzeichnis P
und darin ein Verzeichnis xxx angelegt.
Der Wert von f ist PC050005.JPG:s/P/xxx/, und genau dahin will mv schreiben.

Dein script von eben liefert


localhost:~/t$ rtest xxx
PC050005.JPG /P/xxx/PC050005.JPG
mv: cannot move `PC050005.JPG' to `/P/xxx/PC050005.JPG': No such file or directory
Exit 1

mv versucht wiederum, nach /P/xxx/PC050005.JPG zu schreiben.

bischi
07-04-2010, 14:50
Sorry - müsste natürlich heissen:



#!/bin/tcsh
foreach filename (`ls *JPG`)
set f = "P/"$1"/"
echo $filename $f
mv $filename $f
end


MfG Bischi

DanielDD
07-04-2010, 14:56
localhost:~/t$ rtest xxx
PC050005.JPG P/xxx/
mv: cannot move `PC050005.JPG' to `P/xxx/': No such file or directory
Exit 1

Der Wert der Variablen f ist jetzt P/xxx/, und genau dahin will mv schreiben.

bischi
07-04-2010, 18:25
Ev. musst du das Verzeichnis zuerst noch anlegen ;)

MfG Bischi

DanielDD
07-04-2010, 18:36
Ev. musst du das Verzeichnis zuerst noch anlegen ;)


Ich glaube, Du hast das Problem falsch verstanden. Ich will Dateien
innerhalb des aktuellen Verzeichnisses umbenennen. Wenn ich das script
mit dem Parameter xxx aufrufe, dann soll in jeder *.JPG-Datei im
aktuellen Verzeichnis das erste P durch xxx ersetzt werden.

Ich habe jetzt folgendes script zurechtgebastelt. Wahrscheinlich gewinne
damit ich den Preis für die umständlichste Lösung.


#!/bin/tcsh
foreach filename (`ls *JPG`)
set pos = `expr index $filename P`
set posl = `expr $pos - 1`
set posr = `expr $pos + 1`
set f = `expr substr $filename 1 $posl`$1`expr substr $filename $posr 1000`
echo $filename $f
mv $filename $f
end

bischi
08-04-2010, 07:57
Ich glaube, Du hast das Problem falsch verstanden.

Jup - das glaube ich auch ;)

MfG Bischi