[Batch] Hulp gezocht met zoek-script met find/replace

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • mickjuh
  • Registratie: Mei 2004
  • Laatst online: 09-09 16:55

mickjuh

Good news everyone!

Topicstarter
Tweakers,

Ik loop met een batch script vast en hoop dat iemand mij kan helpen. Het script moet zoeken in een bestand a.xml naar de tekst <blockip> en deze vervangen voor <blockip blockNumber="#"> (met opvolgende nummers)

Heb het bijna voor elkaar maar hij zet nu op elke regel de vervangende tekst :)

Voorbeeld a.xml. Origineel bestaat uit heel veel regels.
code:
1
2
3
4
<blockip>
</blockip>
<blockip>
</blockip>


batch.cmd:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@ECHO OFF
SETLOCAL EnableDelayedExpansion

SET INTEXTFILE=a.xml
SET OUTTEXTFILE=b.xml
SET COUNT=0

FOR /f "tokens=1 delims=" %%A IN ('"type %INTEXTFILE%"') DO (
  SET /A "COUNT=!COUNT!+1"

  SET STRING=%%A
  SET MODSTRING=!STRING:^<blockip^>=!^<blockip blockNumber=!COUNT!^>!
  ECHO !MODSTRING!>> %OUTTEXTFILE%
)

DEL %INTEXTFILE%
RENAME %OUTTEXTFILE% %INTEXTFILE%


De output hier van is:
code:
1
2
3
4
<blockip blockNumber=1>
</blockip><blockip blockNumber=2>
<blockip blockNumber=3>
</blockip><blockip blockNumber=4>


Regel 1 en 3 zijn opzich goed maar de 2e en 4e regel niet. Iemand die me kan helpen? :)
Alvast bedankt

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Je mist nog een controle of hetgene dat je zoekt überhaupt wel in de huidige tekst zit. Op regels 2 en 4 is dat niet het geval en wordt de vervangende tekst dus aan het einde erbij geplakt, zoals je zelf ook al opmerkte.

Wellicht heb je hier iets aan: http://stackoverflow.com/...s-in-string-not-in-a-file

Acties:
  • 0 Henk 'm!

  • mickjuh
  • Registratie: Mei 2004
  • Laatst online: 09-09 16:55

mickjuh

Good news everyone!

Topicstarter
HuHu schreef op maandag 01 juni 2015 @ 14:20:
Je mist nog een controle of hetgene dat je zoekt überhaupt wel in de huidige tekst zit. Op regels 2 en 4 is dat niet het geval en wordt de vervangende tekst dus aan het einde erbij geplakt, zoals je zelf ook al opmerkte.

Wellicht heb je hier iets aan: http://stackoverflow.com/...s-in-string-not-in-a-file
Dat artikel had ik ook inderdaad gevonden maar had me nog niet geholpen.
Het vinden en vervangen van tekst gaat wel goed als het gewoon puur tekst is en geen andere string.

Voorbeeld met alleen tekst vervangen gaat goed:
code:
1
2
3
4
5
6
7
8
9
10
SET INTEXTFILE=a.xml
SET OUTTEXTFILE=b.xml

FOR /f "tokens=1 delims=" %%A IN ('"type %INTEXTFILE%"') DO (
  SET STRING=%%A
  SET modified=!STRING:haallo=hallo!
ECHO !modified!>> %OUTTEXTFILE%

DEL %INTEXTFILE%
RENAME %OUTTEXTFILE% %INTEXTFILE%

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Waarom Batch en niet Powershell? Dat is iets beter uitgerust voor complexe logica. Anyway, linksom of rechtsom, je zit in Programming verkeerd: Waar hoort mijn topic? ;)

PRG>>WOS

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • mickjuh
  • Registratie: Mei 2004
  • Laatst online: 09-09 16:55

mickjuh

Good news everyone!

Topicstarter
NMe schreef op maandag 01 juni 2015 @ 17:04:
Waarom Batch en niet Powershell? Dat is iets beter uitgerust voor complexe logica. Anyway, linksom of rechtsom, je zit in Programming verkeerd: Waar hoort mijn topic? ;)

PRG>>WOS
Dit is een onderdeel van een groter batch script :) Met Powershell ben ik nog niet zo bekend, met batch scripts wel. Waarschijnlijk is het een klein foutje in deze regel: Een uitroepteken of aanhalingsteken te weinig of op de verkeerde plek:

SET MODSTRING=!STRING:^<blockip^>=!^<blockip blockNumber=!COUNT!^>!

Met alleen tekst gaat het wel goed:

SET MODSTRING=!STRING:test=teeeest!

Maar met een (optel)string in een string niet. Maargoed ik zie het even niet :)

Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Staat er niet een uitroepteken teveel?

Acties:
  • 0 Henk 'm!

  • Killah_Priest
  • Registratie: Augustus 2001
  • Laatst online: 20-09 18:58
Met powershell kun je gewoon een xml inlezen, een waarde wijzigen en het weer saven, of je doet zeer makkelijk een replace op een script.
Batch is anno 2015 toch wel enorm achterhaald en leren om een dergelijk PS script te schrijven is binnen een uur gedaan als je al ervaring hebt met scripten.

Acties:
  • 0 Henk 'm!

  • donderdraak
  • Registratie: Juni 2002
  • Laatst online: 09-07-2017
mickjuh schreef op maandag 01 juni 2015 @ 18:59:
[...]

Dit is een onderdeel van een groter batch script :) Met Powershell ben ik nog niet zo bekend, met batch scripts wel. Waarschijnlijk is het een klein foutje in deze regel: Een uitroepteken of aanhalingsteken te weinig of op de verkeerde plek:

SET MODSTRING=!STRING:^<blockip^>=!^<blockip blockNumber=!COUNT!^>!

Met alleen tekst gaat het wel goed:

SET MODSTRING=!STRING:test=teeeest!

Maar met een (optel)string in een string niet. Maargoed ik zie het even niet :)
Is het inmiddels gelukt?
Ik dacht zelf dat het misschien door whitespace komt of shift in variabel....

Acties:
  • 0 Henk 'm!

  • mickjuh
  • Registratie: Mei 2004
  • Laatst online: 09-09 16:55

mickjuh

Good news everyone!

Topicstarter
donderdraak schreef op maandag 09 november 2015 @ 23:49:
[...]


Is het inmiddels gelukt?
Ik dacht zelf dat het misschien door whitespace komt of shift in variabel....
Het is inmiddels gelukt op een andere manier :) De reden dat ik de blockip elementen wilde gaan nummeren was omdat elk blockip element meerdere sub-elementen had. Bijv:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
<blockip>
    <remoteaddress>IP</remoteaddress> 
    <access> 
            <type>type</type> 
            <object>object</object> 
            <sid>sid</sid> 
    <access> 
    </access> 
            <type>type</type> 
            <object>object 2</object> 
            <sid>sid 2</sid> 
    </access> 
</blockip>


Door het nummeren wilde ik kijken of ik de access sub-elementen later weer kon koppelen aan de blockip elementen waar ze bij hoorden. Ik kwam hier dus niet uit, misschien was mijn bedachte oplossing wel te lastig. Althans ik ben verder gaan zoeken en heb de XML om laten zetten naar CSV. Middels een macro heb ik een sortering gedaan van IP-adressen en die access elementen gescheiden met een komma. De CSV zelf word al gescheiden met puntkomma.

Verder op in het script heb ik een FOR-loop op de puntkomma met daarin een andere FOR-loop voor de komma's. Zo blijven alle sub-elementen bij de elementen waar ze horen. Precies wat ik wilde :)
Pagina: 1