|
JaiBee
Anmeldungsdatum: Juni 8, 2007
Beiträge: 1457
Wohnort: Tübingen
|

4. Juni 2009 12:52
Hallo, ich habe mal wieder eine knifflige Aufgabe, die ich mit meinen begrenzten Kenntnissen leider nicht lösen kann. Ich hoffe, es ist keine Zumutung, so etwas hier im Forum zu verlangen (da ich selbst keine "Vorarbeit geleistet habe ). In einer Textdatei soll folgendes "umgewandelt" werden: 1
2
3
4
5
6
7
8
9
10
11
12 | <menuitem>
<icon>icon1</icon>
<url>http://www.URL1.com</url>
<itemname locale="en-US" ak="R">TITEL 1 EN</itemname>
<itemname locale="de-DE" ak="Z">TITEL 1 DE</itemname>
</menuitem>
<menuitem>
<icon>icon2</icon>
<url>http://www.URL2.com</url>
<itemname locale="en-US" ak="N">TITEL 2 EN</itemname>
<itemname locale="de-DE" ak="N">TITEL 2 DE</itemname>
</menuitem>
|
in item, "TITEL 1 DE"=Go to page, "www.URL1.com"
item, "TITEL 2 DE"=Go to page, "www.URL2.com" <itemname locale="en-US" ak="*">*</itemname> & <icon>*</icon> kann man also gleich rausschneiden.
Falls ihr euch fragt, wozu ich das alles brauche: ich möchte ubuntuusers Menu auch für Opera verfügbar machen. Ob ich das (mit eurer Hilfe ) schaffe, weiß ich noch nicht, da es (zumindest für mich) nicht einfach ist. Vielen Dank! Gruß JaiBee
|
|
schusch
Anmeldungsdatum: Sept. 2, 2008
Beiträge: 284
Wohnort: Berlin
|

4. Juni 2009 13:54
1
2
3
4 | awk -F'[<>]' '
$2 ~ /url/ { sub("^http://","",$3);url=$3 }
$2 ~ /itemname.*de-DE/ { titel=$3 }
$2 ~ /^\/menuitem/ { printf ("item, \"%s\"=Go to page, \"%s\"\n", titel, url) } '
|
|
|
JaiBee
(Themenstarter)
Anmeldungsdatum: Juni 8, 2007
Beiträge: 1457
Wohnort: Tübingen
|

4. Juni 2009 14:13
schusch schrieb: 1
2
3
4 | awk -F'[<>]' '
$2 ~ /url/ { sub("^http://","",$3);url=$3 }
$2 ~ /itemname.*de-DE/ { titel=$3 }
$2 ~ /^\/menuitem/ { printf ("item, \"%s\"=Go to page, \"%s\"\n", titel, url) } '
|
Wow, ich bin beeindruckt . Vielen, vielen Dank! Manchmal sieht die URL etwas anders aus, dann funktioniert es nicht. Kann man mit awk den markierten Teil zuvor auch herausschneiden (allerdings nicht in der Originaldatei!)? <url><![CDATA[http://www.URL-mit-?&%-Sonderzeichen.com]]></url> Viele Grüße JaiBee
|
|
JaiBee
(Themenstarter)
Anmeldungsdatum: Juni 8, 2007
Beiträge: 1457
Wohnort: Tübingen
|

4. Juni 2009 14:35
Ich bräuchte noch etwas: 1
2
3
4
5
6
7 | <menu>
<icon>icon</icon>
<itemname locale="en-US" ak="O">foo bar</itemname>
<itemname locale="de-DE" ak="B">TITEL DE</itemname>
<tooltiptext locale="en-US">foo</tooltiptext>
<tooltiptext locale="de-DE">bar</tooltiptext>
<content>
|
soll werden zu Submenu, TITEL DE, TITEL DE
[TITEL DE] Vielen Dank!! Grüße JaiBee
|
|
schusch
Anmeldungsdatum: Sept. 2, 2008
Beiträge: 284
Wohnort: Berlin
|

4. Juni 2009 14:38
1
2
3
4 | awk -F'[<>]' '
$2 ~ /url/ { split($3, tmp, "[\\[\\]]"); url=tmp[3];sub("^http://","",url) }
$2 ~ /itemname.*de-DE/ { titel=$3 }
$2 ~ /^\/menuitem/ { printf ("item, \"%s\"=Go to page, \"%s\"\n", titel, url) } '
|
|
|
schusch
Anmeldungsdatum: Sept. 2, 2008
Beiträge: 284
Wohnort: Berlin
|

4. Juni 2009 15:26
JaiBee schrieb: Ich bräuchte noch etwas:
<tooltiptext ............ DE">bar interessiert gar nicht? *grübel*
|
|
JaiBee
(Themenstarter)
Anmeldungsdatum: Juni 8, 2007
Beiträge: 1457
Wohnort: Tübingen
|

4. Juni 2009 15:33
schusch schrieb: 1
2
3
4 | awk -F'[<>]' '
$2 ~ /url/ { split($3, tmp, "[\\[\\]]"); url=tmp[3];sub("^http://","",url) }
$2 ~ /itemname.*de-DE/ { titel=$3 }
$2 ~ /^\/menuitem/ { printf ("item, \"%s\"=Go to page, \"%s\"\n", titel, url) } '
|
Dankeschön, aber es funktioniert leider nicht:
item, "Installation"=Go to page, ""
.
noch eine Kleinigkeit: durch [Browser ubuntuusers Menu] ersetzen. Gruß JaiBee
|
|
JaiBee
(Themenstarter)
Anmeldungsdatum: Juni 8, 2007
Beiträge: 1457
Wohnort: Tübingen
|

4. Juni 2009 15:37
schusch schrieb: JaiBee schrieb: Ich bräuchte noch etwas:
<tooltiptext ............ DE">bar interessiert gar nicht? *grübel*
Was meinst du? Tooltips benötige ich vorerst nicht, da ich die "Syntax" dafür bei Opera nicht kenne. Gruß
|
|
Marc 'BlackJack' Rintsch
Anmeldungsdatum: Juni 16, 2006
Beiträge: 3757
Wohnort: Berlin
|

4. Juni 2009 15:47
So langsam wird's glaube ich mal wieder Zeit anzumerken, dass man zum Verarbeiten von XML besser eine richtige Programmiersprache und einen XML-Parser verwendet und keine Textwerkzeuge und reguläre Ausdrücke.
|
|
JaiBee
(Themenstarter)
Anmeldungsdatum: Juni 8, 2007
Beiträge: 1457
Wohnort: Tübingen
|

4. Juni 2009 15:50
Marc 'BlackJack' Rintsch schrieb: So langsam wird's glaube ich mal wieder Zeit anzumerken, dass man zum Verarbeiten von XML besser eine richtige Programmiersprache und einen XML-Parser verwendet und keine Textwerkzeuge und reguläre Ausdrücke.
Da stimmt vermutlich, aber das ist mir erst Recht zu "hoch" . Gruß
|
|
schusch
Anmeldungsdatum: Sept. 2, 2008
Beiträge: 284
Wohnort: Berlin
|

4. Juni 2009 16:03
JaiBee schrieb: schusch schrieb: 1
2
3
4 | awk -F'[<>]' '
$2 ~ /url/ { split($3, tmp, "[\\[\\]]"); url=tmp[3];sub("^http://","",url) }
$2 ~ /itemname.*de-DE/ { titel=$3 }
$2 ~ /^\/menuitem/ { printf ("item, \"%s\"=Go to page, \"%s\"\n", titel, url) } '
|
Dankeschön, aber es funktioniert leider nicht:
[item, "Installation"=Go to page, ""
Die split Funktion teilt den String in den Spitzen Klammern anhand der '[' oder ']' in Felder. In deinem Beispiel steht dann im ersten Feld "!", im zweiten "CDATA" und im dritten die URL. Ist diese Syntax nicht immer gleich muss man sich etwas anderes überlegen.
noch eine Kleinigkeit: durch [Browser ubuntuusers Menu] ersetzen. Gruß JaiBee
Steht nach </content> immer </menu>?
Dann reicht
$2 ~ /\/menu/ { printf("[Browser ubuntuusers Menu]\n") }
|
|
JaiBee
(Themenstarter)
Anmeldungsdatum: Juni 8, 2007
Beiträge: 1457
Wohnort: Tübingen
|

4. Juni 2009 16:17
schusch schrieb: JaiBee schrieb: schusch schrieb: 1
2
3
4 | awk -F'[<>]' '
$2 ~ /url/ { split($3, tmp, "[\\[\\]]"); url=tmp[3];sub("^http://","",url) }
$2 ~ /itemname.*de-DE/ { titel=$3 }
$2 ~ /^\/menuitem/ { printf ("item, \"%s\"=Go to page, \"%s\"\n", titel, url) } '
|
Dankeschön, aber es funktioniert leider nicht:
[item, "Installation"=Go to page, ""
Die split Funktion teilt den String in den Spitzen Klammern anhand der '[' oder ']' in Felder. In deinem Beispiel steht dann im ersten Feld "!", im zweiten "CDATA" und im dritten die URL. Ist diese Syntax nicht immer gleich muss man sich etwas anderes überlegen.
Kann man nicht den CDATA-Teil <![CDATA[*]]> herausschneiden, bevor awk startet?
noch eine Kleinigkeit: durch [Browser ubuntuusers Menu] ersetzen. Gruß JaiBee
Steht nach </content> immer </menu>?
Dann reicht
$2 ~ /\/menu/ { printf("[Browser ubuntuusers Menu]\n") }
Ja, aber ich glaube dir ist ein kleiner Fehler unterlaufen. Muss es nicht $2 ~ /\/content/ { heißen? Bei deiner Lösung wird [Browser ubuntuusers Menu] nach fast jeder Zeile eingefügt...
Das ist auch noch nicht mit drin, oder? Gruß PS: Danke schusch für deine großartige Hilfe!
|
|
schusch
Anmeldungsdatum: Sept. 2, 2008
Beiträge: 284
Wohnort: Berlin
|

4. Juni 2009 19:09
Marc 'BlackJack' Rintsch schrieb: So langsam wird's glaube ich mal wieder Zeit anzumerken, dass man zum Verarbeiten von XML besser eine richtige Programmiersprache und einen XML-Parser verwendet und keine Textwerkzeuge und reguläre Ausdrücke.
ACK, aber lass uns doch ein bisschen awk üben  Es ist aber Zeit zu erklären, was die Zeilen sollen. mit der Angabe der Option -F'[<>]' sind < und > Feldtrenner, d.h. das erste Tag ist das zweite Feld (=$2) zu $2 ~ /\/match/ passt z.B. "/match", aber auch "/matches" oder auch "mis/match" In dem regulären Ausruck ist ^ der Zeilen Anfang, . ein beliebiges Zeichen, .* ein beliebiges Zeichen beliebig oft und $ das Zeilenende. Um also nur bei </menu> ein Ausgabe zu bekommen muss man die Bedingung, in awk spricht man vom Pattern, ändern 1 | $2 ~ /^\/menu$/ { printf("[Browser ubuntuusers Menu]\n") }
|
Lies mal, mindestens diagonal z.B. http://www-e.uni-magdeburg.de/urzs/awk/ Für das weitere Problem muss die Zeile
1 | <itemname locale="de-DE" ak="B">TITEL DE</itemname>
|
gelesen werden, wie unterscheidest du aber, ob bei /itemname der Titel (=$3) gemerkt und bei /menuitem ausgegeben wird (wie oben), oder ob wir
ausgeben?
|
|
JaiBee
(Themenstarter)
Anmeldungsdatum: Juni 8, 2007
Beiträge: 1457
Wohnort: Tübingen
|

4. Juni 2009 23:25
Danke für die Erklärung! Ich habe eigentlich auch ein ausführliches Buch zum Thema herumliegen, aber das awk-Kapitel habe ich mir noch nicht wirklich angeschaut .
schusch schrieb: Für das weitere Problem muss die Zeile
1 | <itemname locale="de-DE" ak="B">TITEL DE</itemname>
|
gelesen werden, wie unterscheidest du aber, ob bei /itemname der Titel (=$3) gemerkt und bei /menuitem ausgegeben wird (wie oben), oder ob wir
ausgeben?
Stimmt, das ist ein Problem. Ich habe mal versucht, mehrere Zeilen mit in das Muster aufzunehmen, aber das hat nicht richtig funktioniert (falls das überhaupt möglich ist). Gruß
|
|
schusch
Anmeldungsdatum: Sept. 2, 2008
Beiträge: 284
Wohnort: Berlin
|

5. Juni 2009 08:22
Hallo, ich vermute , so könnte es richtig sein
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 | awk -F'[<>]' '
$2 ~ /^url$/ {
if ($3 == "") url=$4; else url=$3
split(url, tmp, ":")
url=tmp[2];gsub("\/","",url);gsub("\]","",url)
}
$2 ~ /^itemname.*de-DE/ {
titel=$3
}
$2 ~ /^\/menuitem$/ {
printf ("item, \"%s\"=Go to page, \"%s\"\n", titel, url)
}
$2 ~ /^content$/ {
printf ("Submenu, %s, %s\n[%s]\n", titel, titel, titel)
}
$2 ~ /^\/content$/ {
printf "[Browser ubuntuusers Menu]\n"
}
'
|
Testdaten:
<menu>
<icon>icon</icon>
<itemname locale="en-US" ak="O">foo bar</itemname>
<itemname locale="de-DE" ak="B">TITEL DE</itemname>
<tooltiptext locale="en-US">foo</tooltiptext>
<tooltiptext locale="de-DE">bar</tooltiptext>
<content>
<menuitem>
<icon>icon1</icon>
<url>http://www.URL1.com</url>
<itemname locale="en-US" ak="R">TITEL 1 EN</itemname>
<itemname locale="de-DE" ak="Z">TITEL 1 DE</itemname>
</menuitem>
<menuitem>
<icon>icon2</icon>
<url>http://www.URL2.com</url>
<itemname locale="en-US" ak="N">TITEL 2 EN</itemname>
<itemname locale="de-DE" ak="N">TITEL 2 DE</itemname>
</menuitem>
<menuitem>
<icon>icon2</icon>
<url><![CDATA[http://www.URL-mit-?&%-Sonderzeichen.com]]></url>
<itemname locale="en-US" ak="N">TITEL 2 EN</itemname>
<itemname locale="de-DE" ak="N">TITEL 2 DE</itemname>
</menuitem>
</content>
</menu> Ergebnis:
Submenu, TITEL DE, TITEL DE
[TITEL DE]
item, "TITEL 1 DE"=Go to page, "www.URL1.com"
item, "TITEL 2 DE"=Go to page, "www.URL2.com"
item, "TITEL 2 DE"=Go to page, "www.URL-mit-?&%-Sonderzeichen.com"
[Browser ubuntuusers Menu] Versuch mal *gespanntbin*
|