[sed] alleen eerste match, maar wel alle matches

Pagina: 1
Acties:

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 25-01 08:30
Eem ja, hoe leg je dat nou uit.. Voorbeeldje maar denk ik

code:
1
echo "<script>moet weg</script>hoi<script></script>" | sed -e 's/<script>.*<\/script>//g'


Ik wil dus alles tussen alle paren <script> en </script> weghalen, maar alles wat daar niet tussen staat (de hoi in dit voorbeeld) laten staan. In dit voorbeeld gaat dit fout, omdat sed alles tussen de eerste <script> en de laatste </script> weghaalt.

Ik had het volgende al geprobeerd:
code:
1
echo "<script>moet weg</script>hoi<script></script>" | sed -e 's/<script>[^<\/script>]*<\/script>//g'

maar dan blijft er staan:
code:
1
<script>moet weg</script>hoi
omdat de [^</script>]* een set is, en niet een letterlijke string.

De vraag: hoe krijg ik wél een letterlijke string in een [^]* constructie?
Ik hoop dat mijn vraag duidelijk is :)

  • MrJay
  • Registratie: Juni 2004
  • Laatst online: 24-10-2024
Door deze * operator "lazy" te maken, gaat de pc op zoek naar de kortst mogelijke match. Je expressie zou dus moeten worden:

code:
1
s/<script>.*?<\/script>//g


Maar ik heb geen idee of sed deze constructie wel ondersteund (kan momenteel niet testen op windows bak)

  • blaataaps
  • Registratie: Juli 2001
  • Niet online
Je moet non-greedy matchen, maar ik denk niet dat sed dat kan, perl bijvoorbeeld kan het wel:
code:
1
2
3
% echo "<script>moet weg</script>hoi<script></script>" | perl -pe 's/<script>.*?<\/script>//g'
hoi
%
doet precies wat je wil volgens mij?

[ Voor 8% gewijzigd door blaataaps op 12-04-2007 00:21 . Reden: RPROMPT even weggehaald, was beetje breed :) ]


  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 25-01 08:30
MrJay schreef op donderdag 12 april 2007 @ 00:15:
Door deze * operator "lazy" te maken, gaat de pc op zoek naar de kortst mogelijke match. Je expressie zou dus moeten worden:

code:
1
s/<script>.*?<\/script>//g


Maar ik heb geen idee of sed deze constructie wel ondersteund (kan momenteel niet testen op windows bak)
Helaas.. sed blijft erg actief ;) Maarrr, eens even zoeken op het lazy maken van die operatie, kijken wat daar van komt
blaataaps schreef op donderdag 12 april 2007 @ 00:19:
Je moet non-greedy matchen, maar ik denk niet dat sed dat kan, perl bijvoorbeeld kan het wel:
code:
1
2
3
% echo "<script>moet weg</script>hoi<script></script>" | perl -pe 's/<script>.*?<\/script>//g'
hoi
%
doet precies wat je wil volgens mij?
Juist! Dat werkt! :> Nu eens zien of we sed non-greedy kunnen krijgen...

[ Voor 92% gewijzigd door DRvDijk op 12-04-2007 00:23 ]


  • Buffy
  • Registratie: April 2002
  • Laatst online: 26-12-2024

Buffy

Fire bad, Tree pretty

Anders kan je "[^</script>]" ook voluit schrijven. Smerig maar het werkt wel :)

code:
1
sed -e 's/<script>\([^<]\|<\([^s]\|s\([^c]\|c\([^r]\|r\([^i]\|i\([^p]\|p\([^t]|t\([^>]\)\)\)\)\)\)\)\)*<\/script>//g'

That which doesn't kill us, makes us stranger - Trevor (AEon FLux)
When a finger points at the moon, the imbecile looks at the finger (Chinese Proverb)


  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 25-01 08:30
code:
1
2
3
Snow:~ drvdijk$ echo "<script>delete</script>hi<script></script>" | sed -e 's/<script>\([^<]\|<\([^s]\|s\([^c]\|c\([^r]\|r\([^i]\|i\([^p]\|p\([^t]|t\([^>]\)\)\)\)\)\)\)\)*<\/script>//g'
<script>delete</script>hi
Snow:~ drvdijk$

Ik ben gewoon lui, niet goed gekeken of de lelijkheid compleet klopt ;) Als het uiteindelijk een probleem gaat worden met het niet aanwezig zijn van perl, ga ik hier wel even goed naar kijken.

  • Buffy
  • Registratie: April 2002
  • Laatst online: 26-12-2024

Buffy

Fire bad, Tree pretty

DRvDijk schreef op donderdag 12 april 2007 @ 00:40:
code:
1
2
3
Snow:~ drvdijk$ echo "<script>delete</script>hi<script></script>" | sed -e 's/<script>\([^<]\|<\([^s]\|s\([^c]\|c\([^r]\|r\([^i]\|i\([^p]\|p\([^t]|t\([^>]\)\)\)\)\)\)\)\)*<\/script>//g'
<script>delete</script>hi
Snow:~ drvdijk$

Ik ben gewoon lui, niet goed gekeken of de lelijkheid compleet klopt ;) Als het uiteindelijk een probleem gaat worden met het niet aanwezig zijn van perl, ga ik hier wel even goed naar kijken.
Hmmm, dat is raar, als ik jouw voorbeeld copy-paste en uitvoer dan krijg ik gewoon "hi" ipv "<script>delete</script>hi". Welke versie van sed heb je daar (of gebruik je soms bussybox)?

That which doesn't kill us, makes us stranger - Trevor (AEon FLux)
When a finger points at the moon, the imbecile looks at the finger (Chinese Proverb)


  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 25-01 08:30
GNU sed version 4.1.4 werkt inderdaad wat je zegt, waar ik net op testte was een macbook, dus dat zal wel een of andere BSD versie zijn (--version werkt niet eens :p)
Pagina: 1