[terminal] sed commando geeft foute output

Pagina: 1
Acties:

  • Timo
  • Registratie: Oktober 2001
  • Laatst online: 17-12-2025
Beste mensen,

Ik was opzoek naar een script dat in een map met bijvoorbeeld 45.html bestanden deze allemaal kan openen en een bepaalde tekst vervangen.

Hiervoor heb ik het volgende gezocht:
code:
1
2
3
for $fl in '*.html';
do sed 's/Goede Morgen/Weltrusten/g' $fl > $fl.new;
done


Het probleem is als volgt: Met deze code wordt in plaats van alle 45 files afzonderlijk op te slaan als <filenaam.html.new> zodat ik deze kan vervangen wordt het opgeslagen in een *.html.new bestand.
Waarin alle 45 files achter elkaar gezet worden (ongeveer net zoals de output in de terminal.

Doe ik in plaats van bovenstaande code het volgende:
code:
1
2
3
for $fl in '*.html';
do sed 's/Goede Morgen/Weltrusten/g' $fl > $fl;
done

Dan krijg ik de outputmessage: Ambigious Redirect.

Weet iemand hoe ik dit werkend krijg? Code lijkt volgens mij goed, ik weet niet of dit een beperking van het sedcommando (of de for lus is). :? :'(

  • blaataaps
  • Registratie: Juli 2001
  • Niet online
Ik weet niet welke shell je gebruikt maar hier krijg ik gewoon een error (of je hebt $fl al eerder gedefinieerd), maar
for $fl in
is fout, dat moet
for fl in
zijn en ik zou zeker geen '*.html' doen, maar gewoon *.html (eventueel zonder de nutteloze punt) of "*.html", tenzij je gewoon 1 bestand hebt met de naam *.html

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 08:29

Gonadan

Admin Beeld & Geluid, Harde Waren
fooker schreef op vrijdag 04 juli 2008 @ 10:43:
Hiervoor heb ik het volgende gezocht:
code:
1
2
3
for $fl in '*.html';
do sed 's/Goede Morgen/Weltrusten/g' $fl > $fl.new;
done
Als je een echo van $fl doet dan zie je dat het één string is.
Hij lust er dus niet doorheen, er is maar één iteratie.

Als je (zoals blaataaps aangeeft) de aanhalingstekens om *.html weghaalt worden het wel meerdere iteraties en dan werkt je eerste script gewoon.
Nu geef je *.html als string op in plaats van een fileset.
Als je trouwens *.html wilt hebben bedoel je waarschijnlijk *\.html, zoals blaataaps ook al aanstipt.

[ Voor 29% gewijzigd door Gonadan op 04-07-2008 11:04 ]

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


  • blaataaps
  • Registratie: Juli 2001
  • Niet online
Dat stip ik niet helemaal aan, de for-syntax is gewoon fout, het is "for in naam", niet "for in $naam", als je alleen de aanhalingstekens aanpast werkt het nog steeds niet denk ik, en ik bedoel niet *\.html (het is geen reguliere expressie dus . hoeft niet ge-escaped te worden) maar meer dat veel mensen denken dat net als met dos de . speciaal is (dus *.* voor alle bestanden ipv slechts *) :)

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 08:29

Gonadan

Admin Beeld & Geluid, Harde Waren
blaataaps schreef op vrijdag 04 juli 2008 @ 11:07:
Dat stip ik niet helemaal aan, de for-syntax is gewoon fout, het is "for in naam", niet "for in $naam", als je alleen de aanhalingstekens aanpast werkt het nog steeds niet denk ik,
De declaratie van $fl is inderdaad fout, declareren doe je zonder $.
Maar zonder aanhalingstekens werkt het wel. Omdat het dan geen string meer is.
Heb ik zelf getest.
en ik bedoel niet *\.html (het is geen reguliere expressie dus . hoeft niet ge-escaped te worden) maar meer dat veel mensen denken dat net als met dos de . speciaal is (dus *.* voor alle bestanden ipv slechts *) :)
Ah zo. Inderdaad, de punt is slechts een karakter.
En de kans dat er bestanden zijn die op html eindigen maar geen html bestand zijn is verwaarloosbaar. ;)

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


  • blaataaps
  • Registratie: Juli 2001
  • Niet online
Gonadan schreef op vrijdag 04 juli 2008 @ 11:15:
[...]

De declaratie van $fl is inderdaad fout, declareren doe je zonder $.
Maar zonder aanhalingstekens werkt het wel. Omdat het dan geen string meer is.
Heb ik zelf getest.
Ja ik bedoelde ook niet dat wat je zei over de aanhalingstekens niet klopte, maar dat het niet voldoende was hoogstwaarschijnlijk :)

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 08:29

Gonadan

Admin Beeld & Geluid, Harde Waren
blaataaps schreef op vrijdag 04 juli 2008 @ 11:16:
Ja ik bedoelde ook niet dat wat je zei over de aanhalingstekens niet klopte, maar dat het niet voldoende was hoogstwaarschijnlijk :)
Nee inderdaad.
Als je de aanhalingstekens weghaalt én de ampersand verwijderd in de 'for loop' dan komt het goed.

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8


  • Timo
  • Registratie: Oktober 2001
  • Laatst online: 17-12-2025
Okay bedankt, dat ga ik straks even proberen. Thanks :) _/-\o_

(Code stukje was even uit mn hoofd opgeschreven, blijkbaar vergist met for $fl in :p )
code:
1
2
3
for fl in *.html;
do sed 's/Goede Morgen/Weltrusten/g' $fl > $fl;
done


Als ik het goed heb zal dit dan de opvolgende code moeten worden, vraag me alleen even af of die laatste $fl > $fl; dan werkt? :) Of moet ik daar eerst $fl.new en dan move/rename doen? :)

[ Voor 50% gewijzigd door Timo op 04-07-2008 12:21 ]


  • RemcoDelft
  • Registratie: April 2002
  • Laatst online: 28-01 18:26
Gaat het goed met de spatie binnen sed?
Ik doe altijd zoiets:
code:
1
2
3
for i in `ls *.jpg`;
do echo $i;
done

Hiermee kan je dan heel simpel de output testen, voor je andere dingen invult.

  • Gonadan
  • Registratie: Februari 2004
  • Laatst online: 08:29

Gonadan

Admin Beeld & Geluid, Harde Waren
fooker schreef op vrijdag 04 juli 2008 @ 12:18:
Okay bedankt, dat ga ik straks even proberen. Thanks :) _/-\o_

(Code stukje was even uit mn hoofd opgeschreven, blijkbaar vergist met for $fl in :p )
code:
1
2
3
for fl in *.html;
do sed 's/Goede Morgen/Weltrusten/g' $fl > $fl;
done


Als ik het goed heb zal dit dan de opvolgende code moeten worden, vraag me alleen even af of die laatste $fl > $fl; dan werkt? :) Of moet ik daar eerst $fl.new en dan move/rename doen? :)
Kopieer de map met die bestanden even en test het zou ik zeggen. ;)

Look for the signal in your life, not the noise.

Canon R6 | RF 24-70 f/2.8 L | 50 f/1.8 STM | 430EX II
Sigma 85 f/1.4 Art | 100-400 Contemporary
Zeiss Distagon 21 f/2.8

Pagina: 1