Toon posts:

[Bash] String transformation

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben al een tijd iets aan het proberen met sed en awk maar het lijkt er op dat ik er niet uit kom dus hierbij even een vraag of iemand de oplossing weet.

Ik heb een file (x.txt) met daarin iets van de volgende html code:

</td></tr><tr><td class="caller"> <div class="callerid"><a id="calid9978" href="http://10.80.1.120:9200" title="group1" class="callidlink"><img class="callidimg" src="http://10.80.2.120/gr1.jpg" alt="Groep 1 call-list"></a></div>
</td></tr><tr><td class="caller"> <div class="callerid"><a id="dept56" href="http://dept56.internal.loc" title="dept56" class="callidlink"><img class="callidimg" src="http://dept56.internal.loc/56int.gif" alt="afdeling 56"></a></div>

Nu wil ik met sed/awk/grep en/of iets heel anders zolang het maar vanuit een bash script te draaien is de volgende output hebben:

calid9978 http://10.80.1.120:9200 group1 http://10.80.2.120/gr1.jpg Groep 1 call-list
dept56 http://dept56.internal.loc dept56 http://dept56.internal.loc/56int.gif afdeling 56


Op de een of andere manier krijg ik het niet voor elkaar... heeft iemand een slim idee hoe je zo iets in elkaar moet zetten? Het gaat per bestand over ongeveer 200 regels.... dus in het resultaat zouden deze dus ook als 200 regels terug moeten komen.....


Alvast dank voor de antwoorden. :-)

Johan.

  • susscorfa
  • Registratie: Augustus 2006
  • Laatst online: 15:43
iets als


cat *.txt | sed -e "s/<\/td><\/tr><tr><td class=\"caller\"> <div class=\"callerid\"><a id=\"//" -e "s/\" href=\"/ /" > new.txt

niet erg elegant maar werkt denk ik wel

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Je zou XSLT kunnen gebruiken, maar dat vereist wel dat je invoer valide XML is (en dat lijkt het nu niet te zijn, het img-element wordt nu niet afgesloten).

Je zou dan zoiets kunnen doen:
XSLT:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="ISO-8859-1"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="/">
  <html><body>
  <xsl:for-each select="descendant::div[@class='callerid']/a">
    <xsl:value-of select="@id"/>&nbsp;
    <xsl:value-of select="@href"/>&nbsp;
    <xsl:value-of select="@title"/>&nbsp;
    <xsl:value-of select="img/@src"/>&nbsp;    
    <xsl:value-of select="img/@alt"/>&nbsp;
    <br />
  </xsl:for-each>
  </body></html>
</xsl:template>
</xsl:stylesheet>

(Er staat nu expres HTML-spul tussen zodat je het resultaat op deze pagina goed kunt zien.): Plak bovenstaande XSLT in het rechter vak, plak onderstaande (valide) xml in het linker vak en klik op "Edit and click me":
XML:
1
2
3
4
5
6
7
<root>
<tr><td class="caller"><div class="callerid">
  <a id="calid9978" href="http://10.80.1.120:9200" title="group1" class="callidlink"><img class="callidimg" src="http://10.80.2.120/gr1.jpg" alt="Groep 1 call-list" /></a>
</div></td></tr><tr><td class="caller"><div class="callerid">
  <a id="dept56" href="http://dept56.internal.loc" title="dept56" class="callidlink"><img class="callidimg" src="http://dept56.internal.loc/56int.gif" alt="afdeling 56" /></a>
</div></td></tr>
</root>

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 26-01 22:46

Creepy

Tactical Espionage Splatterer

Je krijgt het niet voor elkaar? Maar wat heb je dan al wel geprobeerd? Tegen welke problemen liep je dan aan? Kreeg je misschien foutmeldingen? We need more info ;) Alleen aangeven wat je wilt en hopen dat iemand je een kant en klare oplossing aandraagt is hier NIET de bedoeling ondanks de paar posts hierboven. Het is de bedoeling om zelf te ontwikkelen. GoT is geen helpdesk om even snel een oplossing te scoren.

[ Voor 43% gewijzigd door Creepy op 08-11-2009 09:56 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Verwijderd schreef op zaterdag 07 november 2009 @ 13:18:
Nu wil ik met sed/awk/grep en/of iets heel anders zolang het maar vanuit een bash script te draaien is
Dat is een beetje vaag criterium: je kan vanuit een Bash script ook een Perl, PHP, Python, Ruby of, zoals hierboven gezegd, XSLT interpreter starten. Dat lijken me geschiktere tools dan awk en sed, vooral omdat een library voor de verwerking van HTML/XML vaak al bijgeleverd, of gemakkelijk te krijgen, is.

Wie trösten wir uns, die Mörder aller Mörder?


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22-01 23:51

NMe

Quia Ego Sic Dico.

'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.


  • enyoj
  • Registratie: Juni 2009
  • Laatst online: 23-11-2025
code:
1
2
3
4
#! /bin/bash
if [ -f $1 ] ; then
   cat $1 | sed -e "s/.*\(a id=\)\"\([^\"]*\)\"[^\"]*\"\([^\"]*\)\"[^\"]*\"\([^\"]*\)\"[^\"]*\"[^\"]*\"[^\"]*\"[^\"]*\"[^\"]*\"\([^\"]*\)\"[^\"]*\"\([^\"]*\)\".*/\2 \3 \4 \5 \6/"
fi


doet precies wat je vraagt :)

  • MartinMeijerink
  • Registratie: Juli 2008
  • Laatst online: 15:36

MartinMeijerink

Computerrorist

We maken van double-qoute de field-separator, dan willen we dus de fields 6, 8, 10 en 16 hebben, en daarbij filteren we de field-separator zelf er met sed nog even uit, krijg je deze simpele en leesbare code:
code:
1
cat x.txt|cut -d\" -f 6,8,10,16,18|sed s/'"'/' '/g

Geen dank, graag gedaan... :)

[ Voor 2% gewijzigd door MartinMeijerink op 08-11-2009 14:56 . Reden: typo ]

An unbreakable toy is useful to break other toys


  • Kees
  • Registratie: Juni 1999
  • Laatst online: 14:51

Kees

Serveradmin / BOFH / DoC
MartinMeijerink schreef op zondag 08 november 2009 @ 14:56:
We maken van double-qoute de field-separator, dan willen we dus de fields 6, 8, 10 en 16 hebben, en daarbij filteren we de field-separator zelf er met sed nog even uit, krijg je deze simpele en leesbare code:
code:
1
cat x.txt|cut -d\" -f 6,8,10,16,18|sed s/'"'/' '/g

Geen dank, graag gedaan... :)
Naja, bijna dan.. beetje cat abuse, en een onnodige sed. Volgens mij werkt dit gewoon al:
cut -d '"' -f 6,8,10,16,18 x.txt |tr '"' ' '

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan

Pagina: 1