mboost-dp1

Problemer med GNU sed


Gå til bund
Gravatar #1 - BurningShadow
12. nov. 2011 22:42
Jeg har et lille problem med sed, som jeg håber en af jer, kender løsningen på.


Jeg har en fil, med følgende linje:
MANDIR = $(INSTDIR)/man

jeg prøver så følgende, for at rette det:
sed -i "s,$(INSTDIR),$(PACKAGEDIR),g" Makefile

og ville ønske at resultatet blev:
MANDIR = $(PACKAGEDIR)/man

hvilket det ikke gør, da jeg får denne fejl:
"sed -e expression #1, char 0: no previous regular expression"

Er der en der har et bud på hvad jeg gør forkert?
Jeg bruger sed ver. 4.1.5, hvis det har nogen betydning.
Gravatar #2 - D_V
12. nov. 2011 23:12
Vil gætte på at det er fordi $ bruges til backreference, af det tidligere matchede.
I samme stil som dine paranteser i match strengen måske også volder problemmer.
Prøv at escape det med en \ før $. Ingen ide om det vil hjælpe.
Gravatar #3 - BurningShadow
12. nov. 2011 23:18
Jeg har prøvet en \ men det hjalp ikke.
Gravatar #4 - D_V
12. nov. 2011 23:30
Følgende virkede ganske fint for mig, bruger \ istedet for ,
Da jeg aldrig har set , brugt før ?



cat test.txt | sed "s/\$(INSTDIR)/\$(PACKAGEDIR)/g"
Gravatar #5 - onetreehell
12. nov. 2011 23:31
Hvad med single-quotes? Det er ikke din shell der expander noget uventet?
Gravatar #6 - LinguaIgnota
13. nov. 2011 00:33
Jeg skimmede overskriften og troede, at du havde et problem med gnusæd. Dét kunne jeg måske have hjulpet med.
Gravatar #7 - myplacedk
13. nov. 2011 08:21
BurningShadow (3) skrev:
Jeg har prøvet en \ men det hjalp ikke.

Har du prøvet med to? Dollartegnet har hver sin specialbetydning i søg-delen og erstat-delen.

$ sed --version | grep version
GNU sed version 4.2.1
$ echo 'MANDIR = $(INSTDIR)/man' > Makefile
$ sed -i "s,\$(INSTDIR),\$(PACKAGEDIR),g" Makefile
$ cat Makefile
MANDIR = $(PACKAGEDIR)/man
Gravatar #8 - myplacedk
13. nov. 2011 08:29
D_V (4) skrev:
Da jeg aldrig har set , brugt før ?

Du kan vist bruge lige det tegn du har lyst til, det er bare praktisk hvis det er et tegn der ikke bruges andre steder på linjen, for så slipper du for noget escaping.
Gravatar #9 - BurningShadow
13. nov. 2011 09:27
#4 virker, hvis jeg smider det i et selvstændigt script, som jeg så kalder. Det er også helt Ok, så fristes jeg ikke til at lave noget grimt rod ;-)
Gravatar #10 - BurningShadow
13. nov. 2011 09:28
#6

Det bekymre mig en anelse, at du kan hjælpe med gnu sæd...
Gravatar #11 - kasperd
13. nov. 2011 22:08
Du har begået to fejl. Du har brugt doublequotes i stedet for singlequotes, hvilket gør at din shell vil fortolke $ tegnene. Jeg ved ikke hvilken shell du bruger. I bash giver kommandoen følgende fejl pga. forkerte quotes:

INSTDIR: command not found
PACKAGEDIR: command not found

Hvis man har brug for at nogle tegn fortolkes af shell og andre ikke gør, så kan man lave mere avancerede konstruktioner så som escaping og kombinationer af forskellige typer quotes. Men da du bare skal have det hele sendt videre uden fortolkning af shell, er det nemmest blot at bruge singlequotes.

Den anden fejl er at du har glemt at bruge -e for at angive at shell scriptet er på kommandolinien.

Jeg tror det du mente var:
sed -i -e 's,$(INSTDIR),$(PACKAGEDIR),g' Makefile
Gravatar #12 - BurningShadow
13. nov. 2011 23:40
#11

Takker :-)
Gravatar #13 - kasperd
14. nov. 2011 23:21
Dette citat er nok egentlig meget passende i denne tråd
Sed is very powerful. A single sed statement can turn a cat into cement. Observe:

echo cat | sed statement
Gravatar #14 - onetreehell
15. nov. 2011 17:27
#13
Haha! :-)

Jeg er godt nok glad for vim ikke tillader at man bruger bogstaver som delimiters :-)

Jeg kan se at ed tillader det.

Thanks for sharing
Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login