PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sed Parameter übergeben



athos
11-02-2007, 20:52
Hallo zusammen,
ich brauche wieder einmal Eure hilfe.
Ich liste alle files in einem Verzeichnis auf und möchte den file Namen per Parameter an sed übergeben. Aber irgendwie funktioniert das nicht.

for i in $(ls -1 *.fxv); do sed ’s/\(.\{15\}\)/\${i%/*}/’ ${i%/*} > ${i%/*}.f1; done

Wäre super wenn jemand eine lösung für mich hätte.;)

peschmae
11-02-2007, 20:57
Der direkte Grund ist einfach: die ' ' verhindern dass die Shell das ${i} ersetzt.

Damit die Shell da ran darf musst du " " oder überhaupt keine Anführungszeichen verwenden. Du kannst auch den mit ' ' s umschlossenen Teil einfach "ringsherum" machen à la:
'nicht von shell bearbeitet'${meineVariable}'auch nicht von Shell zerstört'

Anmerkung zum Aufruf:
1. dein ls ist überflüssig, ein for i in *.fxv; geht genau so gut (spart dir aber einen Prozess - das ls ;))
2. das Problem - sowohl mit ls als auch mit dem for f in *.fxv ist dass das ganze nicht einfach so funktioniert wenn die Dateinamen Leerzeichen enthalten - dann wird nämlich die For-Schleife für jedes Wort einmal aufgerufen und nicht für jede Datei...
3. deshalb entweder vorher IFS setzen à la


IFS="
"

oder
4. find benutzen im Sinne von: find -name "*.fxv" -exec sed blabla {} blabla \;
Gibt afair auch einen Parameter für find der die Suchtiefe auf den aktuellen Ordner beschränkt; das {} hier wird durch den Dateinamen ersetzt; das \; am Zeilenende ist für find damit der weiss wo Schluss ist.

Wobei: Solange du sicher bist dass keine Datei ein Leerzeichen im Namen hat ist das Ganze natürlich kein Problem :)

MfG Peschmä

athos
12-02-2007, 11:09
Danke für Deine schnelle Antwort!

'nicht von shell bearbeitet'${meineVariable}'auch nicht von Shell zerstört'
Ohne das wäre ich wohl nie draufgekommen:D

So klappt es nun
for i in $(ls -1 *.fxv); do sed ’s/\(.\{15\}\)/\1’${i%/*}’/’ ${i%/*} > ${i%/*}.f1; done