[Unix sed] vars gebruiken in sed command script?

Pagina: 1
Acties:

  • durkagain
  • Registratie: April 2000
  • Laatst online: 09-04-2025
Ik wil graag variabelen kunnen gebruiken in een command script (regexp) voor sed. Dit blijkt niet om de normale manier te kunnen, als in 'echo "dit is een var: $VAR"'. In het sed command script ziet sed $VAR als gewone string :(. Escapen lukte me ook niet. sed 's/blaat/$VAR/' werkt dus niet :(.

Heeft iemand hier een idee over, of zijn variabelen gewoon niet mogelijk binnen een command script?

Thanks

  • blaataaps
  • Registratie: Juli 2001
  • Niet online
Dat gaat prima hier.
code:
1
2
3
4
$ foo=bar
$ echo pietje | sed s/pietje/$foo/
bar
$

Maar als je quotes om je dingen heen zet, is het eigenlijk niet meer dan logisch dat bash hem niet expandt : ) , en dat sed het letterlijk krijgt (dat is namelijk waar die single quotes voor zijn)

  • durkagain
  • Registratie: April 2000
  • Laatst online: 09-04-2025
Eigenlijk heel logies! Ik maar met m'n stomme kop denken dat die quotes verplicht waren. Nooit anders geprobeerd, stom |:(.
Thanks in bash doet ie het :) Nog ff in sh testen, maar dat zal ook wel lukken.

  • Broer
  • Registratie: Januari 2002
  • Laatst online: 19-12-2025
Ja, quotejes, met " quoten gaat het wel trouwens:
localhost% export foo=bar
localhost% echo pietje | sed -e "s/pie/$foo/"
bartje
localhost%
op MacOS X dus BSD unix

  • durkagain
  • Registratie: April 2000
  • Laatst online: 09-04-2025
Ah oke, thanks voor de tip :)

  • durkagain
  • Registratie: April 2000
  • Laatst online: 09-04-2025
Nu we toch bezig zijn over sed.
Is het ook mogelijk om de stdout te redirecten naar hetzelfde bestand die je al stdin gebruikt? Hetzelfde bestand overgeven d.m.v. sed "blablabla" target > target gaat dus niet, target is dan na het command leeg.
Het lijkt me eigenlijk onmogelijk omdat target nog open staat zolang het commando runned en als je dan ondertussen er naar toe wil schrijven gaat dat niet...
De oplossing zal zijn in de trant van: eerst de read actie afronden dan pas schrijven... Maar hoe?

  • blaataaps
  • Registratie: Juli 2001
  • Niet online
code:
1
2
3
4
5
$ echo foo > bar
$ cat bar | sed s/foo/jan/ > bar
$ cat bar
jan
$

Op die manier werkt het hier wel. Of dat bij alle versies van bash werkt weet ik eigenlijk niet.

  • durkagain
  • Registratie: April 2000
  • Laatst online: 09-04-2025
Yep dat is dan een work-around, maar wel een mooiere dan ik had bedacht ;) Thanks. Ik zal het eens proberen, het moet in sh zelfs werken, ben benieuwd.

edit:
Werkt in sh ook :D

  • Broer
  • Registratie: Januari 2002
  • Laatst online: 19-12-2025
Deze is ook leuk, met een "named-pipe":
localhost% mkfifo /tmp/fifo
op de ene terminal
en dan
localhost% cat /tmp/fifo | sed s/pie/bar/
op de andere terminal
dan weer
localhost% echo pietje >/tmp/fifo
op de eerste termnal
dan zie je de output op de andere terminal

  • durkagain
  • Registratie: April 2000
  • Laatst online: 09-04-2025
Hmpz inderdaad, kewl :P

Maar prob is bij mij nog niet helemaal gefixed. Het script, waar het sed commando in zit, zit in een sun solaris package, maar op 1 of andere manier runned ie het script niet goed, zodat het target bestand (wat dus ook source was) leeg is...

  • Broer
  • Registratie: Januari 2002
  • Laatst online: 19-12-2025
wazig gedrag kan ook wijzen op een andere shell.
Het meeste werkt wel met de ksh, of zsh of bash onder linux.
kijk in de eerste regel van het script, na de
#!
daar staat welke shell er wordt gebruikt.
Pagina: 1