sed - xml: verwijderen block als string in block voorkomt

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • MisterE
  • Registratie: April 2002
  • Laatst online: 23:33
Ik zoek een manier om een xml block te vewijderen indien in een woord in het block voorkomt, dus:

code:
1
2
3
<filter>
  <hallo>zoeken</hallo>
</filter>


Dit block moet dus weg. Ik heb alleen de algemene bash commando's tot mijn beschikking, dus geen Perl/Python. Met wat speuren kwam ik op dit uit, helaas wist dit maar 1 keer een block en dit moet ie voor alle blocks doen.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
BEGIN='<filter>'
END='<\/filter>'
REGULAREX='zoeken'

cat "/tmp/bestand.xml" | sed ":t /$BEGIN/,/$END/ {    # For each line between these block markers..
        /$END/!{         #   If we are not at the /end/ marker
           $!{          #     nor the last line of the file,
              N;        #     add the Next line to the pattern space
              bt
           }            #   and branch (loop back) to the :t label.
        }               # This line matches the /end/ marker.
        /$REGULAREX/d;       # If /regex/ matches, delete the block.
     }"                  # Otherwise, the block will be printed.

Acties:
  • 0 Henk 'm!

  • Remco
  • Registratie: Januari 2001
  • Laatst online: 03-10 16:57
Kan dat niet met /g ?
sed '/s/origineel/gewijzigd/g'

The best thing about UDP jokes is that I don't care if you get them or not.


Acties:
  • 0 Henk 'm!

  • Wolfboy
  • Registratie: Januari 2001
  • Niet online

Wolfboy

ubi dubium ibi libertas

Sed heeft helaas geen ondersteuning voor multiline regexes, al kan je hier wel omheen werken door de regels toe te voegen aan je hold buffer.

Al zou ik persoonlijk voor een simpelere oplossing gaan :P
Iets als dit kom je al verder mee:
cat bestand | sed -r 's/\t/    /g' | tr '\n' '\t' | sed -r 's/<filter>.*<\/filter>//g' | tr '\t' '\n'


Al werkt dat weer niet goed doordat sed altijd greedy is, dus... ik denk dat je toch een betere regex engine nodig gaat hebben ;)

Blog [Stackoverflow] [LinkedIn]


Acties:
  • 0 Henk 'm!

  • vanaalten
  • Registratie: September 2002
  • Laatst online: 20:05
MisterE schreef op maandag 19 september 2011 @ 14:36:
Met wat speuren kwam ik op dit uit, helaas wist dit maar 1 keer een block en dit moet ie voor alle blocks doen.
Heb je dat stukje code wel goed getest? Want als ik het volgende stukje tekst plaats in een file genaamd /tmp/bestand.xml:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Regel een
<filter>
  <hallo>zoeken</hallo>
</filter>
Regel vijf

Regel zes
Regel zeven
Regel acht
<filter>
  <hallo>zoeken</hallo>
</filter>
Regel negen

<filter>
  <hallo>zoeken</hallo>
</filter>              
Laatste regel

... en ik laat daar jouw script op los, dan krijg ik als output:
code:
1
2
3
4
5
6
7
8
9
Regel een
Regel vijf

Regel zes
Regel zeven
Regel acht
Regel negen

Laatste regel

Lijkt mij toch aardig wat je wil, of ziet je input er anders uit?
Wel een leuk stukje hogere SED-kunde. Ga ik onthouden, bedankt! :)

Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Kijk even naar awk. Daar kun je state bijhouden.

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

  • vanaalten
  • Registratie: September 2002
  • Laatst online: 20:05
H!GHGuY schreef op dinsdag 20 september 2011 @ 12:48:
Kijk even naar awk. Daar kun je state bijhouden.
Awk zal het zeker doen, dat zou ook mijn eerste keus geweest zijn - maar nogmaals, het SED script wat de TS in de OP heeft geplaatst doet het volgens mij gewoon. Of ik heb een verkeerd beeld van de inputfile, maar dat mag dan wel eens uitgelegd worden. Want met SED is dit ook prima mogelijk, al is het wat minder leesbaar dan een AWK oplossing.
Pagina: 1