Problemen met sed-commando in bash

Pagina: 1
Acties:

  • DeepFreeze.NL
  • Registratie: April 2006
  • Laatst online: 12-01 16:11
Ik probeer in een aangemaakt bestand tekst te vervangen door een ander stukje tekst.
Ik heb de volgende code in bash:

code:
1
2
3
4
5
echo -n "zoeken naar: "
read oude_tekst
echo -n "Vervangen door: "
read nieuwe_tekst
sed 's/$oude_tekst/$nieuwe_tekst/g' > $filename

Hierbij is $filename een bestand wat eerder in het programma wordt aangemaakt en bestaat.
Maar het vervangen wil maar niet lukken, wat doe ik fout?

Edit: Inmiddels opgelost, zie onderaan.

[ Voor 6% gewijzigd door DeepFreeze.NL op 11-01-2007 11:55 ]


  • hamsteg
  • Registratie: Mei 2003
  • Laatst online: 22:28

hamsteg

Species 5618

Opzich klopt het sed commando.

code: test_text
1
Hallo daar Monique

]$>more test_text | sed 's/Monique/Henri/g' >>t


Na drie keer staat er
Hallo daar Henri
Hallo daar Henri
Hallo daar Henri

Als ik naar je code kijk zie ik twee fouten:
  • geen input stream, bij SED (Streaming EDitor) is dat een vereiste
  • geen >> waardoor er niet ge-append wordt

Niet quoten, zorgvuldige reacties volgens de regels worden zo weggewerkt: *knip*, reactie op geknipte reactie.


  • DeepFreeze.NL
  • Registratie: April 2006
  • Laatst online: 12-01 16:11
hamsteg schreef op woensdag 10 januari 2007 @ 19:18:
Opzich klopt het sed commando.

code: test_text
1
Hallo daar Monique

]$>more test_text | sed 's/Monique/Henri/g' >>t


Na drie keer staat er
Hallo daar Henri
Hallo daar Henri
Hallo daar Henri

Als ik naar je code kijk zie ik twee fouten:
  • geen input stream, bij SED (Streaming EDitor) is dat een vereiste
  • geen >> waardoor er niet ge-append wordt
Hmmzz, de input is toch die variabelen die ik opgeef, of zie ik dat fout?
Als ik >> i.p.v. > doe dan gebeurt er ook weinig.

Misschien ook wel handig om te vermelden dat mijn bash skills (nog) zeer basic zijn :)

[ Voor 6% gewijzigd door DeepFreeze.NL op 10-01-2007 19:26 ]


  • blaataaps
  • Registratie: Juli 2001
  • Niet online
Dat zie je fout :)
De variabelen die je meegeeft, bepalen het commando, maar niet de input, de input komt van stdin of van een bestand dat je opgeeft, en daar gebeurt nu allebei niks.

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Als je een variabele toewijst moet je er geen $ voor zetten.
code:
1
2
FOO = 5
echo $FOO

geeft als output "5"

Wie trösten wir uns, die Mörder aller Mörder?


  • DeepFreeze.NL
  • Registratie: April 2006
  • Laatst online: 12-01 16:11
Confusion schreef op woensdag 10 januari 2007 @ 19:27:
Als je een variabele toewijst moet je er geen $ voor zetten.
code:
1
2
FOO = 5
echo $FOO

geeft als output "5"
Damn, dat ik dat niet gezien heb 8)7 . Even testen...

  • hamsteg
  • Registratie: Mei 2003
  • Laatst online: 22:28

hamsteg

Species 5618

Klopt bijna, waar moet er dan uit vervangen worden? Je hebt je output gedefinieerd ( ">> $filename") , je hebt het zoek en vervangen gedefinieerd met behulp van sed ("sed 's/$oude_tekst/$nieuwe_tekst/g'") maar je hebt je input stream niet aangegeven, dus waaruit moet worden gezocht en vervangen. Ik doe dat door met "more" een file te tonen en die te "pipen" naar het sed commando maar het kan op verschillende manieren; ("sed -f <inputfilename> 's/$oude_tekst/$nieuwe_tekst/g' >> $file") werkt ook.

edit:
Denk dat ik snap wat je bedoelt/zoekt:
sed -f $filename 's/$oude_tekst/$nieuwe_tekst/g > $filename2
edit:
Geef de tweede filename variabele even een andere filename.

[ Voor 16% gewijzigd door hamsteg op 10-01-2007 19:39 ]

Niet quoten, zorgvuldige reacties volgens de regels worden zo weggewerkt: *knip*, reactie op geknipte reactie.


  • DeepFreeze.NL
  • Registratie: April 2006
  • Laatst online: 12-01 16:11
hamsteg schreef op woensdag 10 januari 2007 @ 19:31:
Klopt bijna, waar moet er dan uit vervangen worden? Je hebt je output gedefinieerd ( ">> $filename") , je hebt het zoek en vervangen gedefinieerd met behulp van sed ("sed 's/$oude_tekst/$nieuwe_tekst/g'") maar je hebt je input stream niet aangegeven, dus waaruit moet worden gezocht en vervangen. Ik doe dat door met "more" een file te tonen en die te "pipen" naar het sed commando maar het kan op verschillende manieren; ("sed -f <inputfilename> 's/$oude_tekst/$nieuwe_tekst/g' >> $file") werkt ook.
Kan er niet in sed in de originele file gekeken worden?
Dus sed -f $filename 's/$oude_tekst/$nieuwe_tekst/g' >> $filename

  • hamsteg
  • Registratie: Mei 2003
  • Laatst online: 22:28

hamsteg

Species 5618

lezen uit een file waar je naar schrijft en vise versa raad ik niet aan maar kan, eh ... niet op windows/dos.

edit:
Zie toevoeging in mijn vorige post.

[ Voor 33% gewijzigd door hamsteg op 10-01-2007 19:44 ]

Niet quoten, zorgvuldige reacties volgens de regels worden zo weggewerkt: *knip*, reactie op geknipte reactie.


  • DeepFreeze.NL
  • Registratie: April 2006
  • Laatst online: 12-01 16:11
hamsteg schreef op woensdag 10 januari 2007 @ 19:41:
lezen uit een file waar je naar schrijft en vise versa raad ik niet aan maar kan, eh ... niet op windows/dos.

edit:
Zie toevoeging in mijn vorige post.
Hmzz, het wil nog steeds niet lukken. Het moet toch, lijkt mij, redelijk eenvoudig zijn door in een tekstbestand een stukje tekst te vervangen d.m.v. een script zoals bovenaan is vermeld zonder dat er andere bestanden voor nodig zijn.

Edit: gebruik van een ander commando is ook prima, zolang er maar geen andere bestanden erbij worden betrokken.

[ Voor 10% gewijzigd door DeepFreeze.NL op 10-01-2007 19:49 ]


  • hamsteg
  • Registratie: Mei 2003
  • Laatst online: 22:28

hamsteg

Species 5618

Wat je vaak ziet is dat men met tijdelijke bestanden werkt (*.tmp) en dat nette programmeurs die in het script voor het einde netjes opruimen. Ik heb in mijn leven al heel wat scripts geschreven en dit is de betrouwbaarste weg. Er zullen vast wel fancy oplossingen zijn voor OS-xyz maar op deze manier werken, werkt op alle OS-en. Daarbij maakt het debuggen makkelijker en vernaggel je je orgineel niet.

Niet quoten, zorgvuldige reacties volgens de regels worden zo weggewerkt: *knip*, reactie op geknipte reactie.


  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

`man sed` verteld ons toch echt:
-i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if extension supplied)
Lijkt me dat je er daarmee wel uit moet kunnen komen ;)

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


  • DeepFreeze.NL
  • Registratie: April 2006
  • Laatst online: 12-01 16:11
hamsteg schreef op woensdag 10 januari 2007 @ 19:49:
Wat je vaak ziet is dat men met tijdelijke bestanden werkt (*.tmp) en dat nette programmeurs die in het script voor het einde netjes opruimen. Ik heb in mijn leven al heel wat scripts geschreven en dit is de betrouwbaarste weg. Er zullen vast wel fancy oplossingen zijn voor OS-xyz maar op deze manier werken, werkt op alle OS-en. Daarbij maakt het debuggen makkelijker en vernaggel je je orgineel niet.
Ok, dan ga ik dat wel doen. In ieder geval alvast bedankt voor je hulp & tips :)

  • hamsteg
  • Registratie: Mei 2003
  • Laatst online: 22:28

hamsteg

Species 5618

Een beetje in strijd met:
DESCRIPTION
Sed is a stream editor. A stream editor is used to perform basic text transformations on an input stream (a file or input from a pipeline).
Een file dus in de breedste context van het woord. Maar goed, weer wat geleerd, thanks! (hey is studie smiley weg?)

[ Voor 8% gewijzigd door hamsteg op 10-01-2007 19:57 ]

Niet quoten, zorgvuldige reacties volgens de regels worden zo weggewerkt: *knip*, reactie op geknipte reactie.


  • Spider.007
  • Registratie: December 2000
  • Niet online

Spider.007

* Tetragrammaton

hamsteg schreef op woensdag 10 januari 2007 @ 19:54:
Een beetje in strijd met:

[...]
.
Maar goed, weer wat geleerd, thanks! (hey is studie smiley weg?)
Waarschijnlijk deden iets teveel mensen dit ;)

---
Prozium - The great nepenthe. Opiate of our masses. Glue of our great society. Salve and salvation, it has delivered us from pathos, from sorrow, the deepest chasms of melancholy and hate


  • Sprite_tm
  • Registratie: September 2002
  • Laatst online: 30-01 01:49

Sprite_tm

Semi-Chinees

DeepFreeze.NL schreef op woensdag 10 januari 2007 @ 19:04:
...
sed 's/$oude_tekst/$nieuwe_tekst/g' > $filename
Dat gaat niet werken, omdat je enkele quotes pakt, expand bash je variabelen niet en krijg je als opdracht letterlijk s/$oude_tekst/$nieuwe_tekst/g. Maak van de enkele apostrophs dubbele aanhalingstekens (") en het werkt ineens een stuk beter :)

Relaxen und watchen das blinkenlichten. | Laatste project: Ikea Frekvens oog


  • freyk
  • Registratie: September 2003
  • Laatst online: 01-02 18:54
bij mij werkte het volgende
code:
1
sed -i 's/vandaag/$morgen/g' bestandje.txt

  • DeepFreeze.NL
  • Registratie: April 2006
  • Laatst online: 12-01 16:11
Inmiddels heb ik, met behulp van dit topic en samen met iemand anders, het kunnen oplossen :) .

Dit is het geworden:
code:
1
2
cat $filename | sed "s/$oude_tekst/$nieuwe_tekst/g" > $filename.tmp
mv $filename.tmp $filename

Bedankt voor jullie hulp!
Pagina: 1