2017-06-19 3 views
-1

Hintergrundinfo: ich eine XML-Datei haben, die meine Lieferanten uploads jede Nacht mit neuen Produkten und aktualisiert Bestandszählungen usw. Aber sie haben mir genäht und sie don Wenn Sie keine Beschreibung in der XML-Datei haben, haben sie eine Verknüpfung zu ihrer Site, die die Beschreibung in Rohtext enthält.
Suchen und Ersetzen von URL mit Inhalten aus URL

Was ich tun muss, ist ein Skript, das das Dokument durchläuft, das ich von ihnen herunterladen und die URL durch den Inhalt der URL ersetzen.

Zum Beispiel, wenn ich habe

<DescriptionLink>http://www.leadersystems.com.au/DataFeed/ProductDetails/AT-CHARGERSTATION-45</DescriptionLink> 

Ich will es

, um am Ende als
<DescriptionLink>Astrotek USB Charging Station Charger Hub 3 Port 5V 4A with 1.5m Power Cable White for iPhone Samsung iPad Tablet GPS</DescriptionLink> 

ich ein paar Dinge ausprobiert habe, aber ich bin nicht sehr bewandert mit Scripting oder Schleifen. Bisher ich habe:

#!/bin/bash 
LINKGET=`awk -F '|' '{ print $2 }' products-daily.txt` 

wget -O products-daily.txt http://www.suppliers-site-url.com 
sed 's/<DescriptionLink>*/<DescriptionLink>$(wget -S -O- $LINKGET/g' products-daily.txt 

Aber noch einmal, ich bin nicht sicher, wie das alles funktioniert wirklich so ist es gewesen, Versuch und Irrtum. Jede Hilfe wird geschätzt !!!

Aktualisiert mit Beispiel-URL.

+0

Können Sie ein URL-Beispiel angeben? Sonst ist es schwierig zu testen ... –

+0

Added URL zum Beispiel :) – Mitchell

Antwort

0

Sie werden so etwas wie dieses (mit GNU awk für die 3. arg übereinstimmen()) wollen:

$ cat tst.awk 
{ 
    head = "" 
    tail = encode($0) 
    while (match(tail,/^([^{]*[{])([^}]+)(.*)/,a)) { 
     desc = "" 
     cmd = "curl -s \047" a[2] "\047" 
     while ((cmd | getline line) > 0) { 
      desc = (desc=="" ? "" : desc ORS) line 
     } 
     close(cmd) 
     head = head decode(a[1]) desc 
     tail = a[3] 
    } 
    print head decode(tail) 
} 
function encode(str) { 
    gsub(/@/,"@A",str) 
    gsub(/{/,"@B",str) 
    gsub(/}/,"@C",str) 
    gsub(/<DescriptionLink>/,"{",str) 
    gsub(/<\/DescriptionLink>/,"}",str) 
    return str 
} 
function decode(str) { 
    gsub(/}/,"</DescriptionLink>",str) 
    gsub(/{/,"<DescriptionLink>",str) 
    gsub(/@C/,"}",str) 
    gsub(/@B/,"{",str) 
    gsub(/@A/,"@",str) 
    return str 
} 

$ awk -f tst.awk file 
<DescriptionLink>Astrotek USB Charging Station Charger Hub 3 Port 5V 4A with 1.5m Power Cable White for iPhone Samsung iPad Tablet GPS</DescriptionLink> 

https://stackoverflow.com/a/40512703/1745001 für Informationen Siehe auf, was der Encoder/Decoder-Funktionen tun und warum.

Beachten Sie, dass dies einer der seltenen Fälle ist, in denen die Verwendung von getline angemessen ist. Wenn Sie jemals in Erwägung ziehen, in Zukunft getline zu verwenden, stellen Sie sicher, dass Sie alle Vorbehalte gelesen und vollständig verstanden haben, und verwenden Sie zuerst die Fälle, die unter besprochen wurden.

+1

Vielen Dank Ed! Das scheint es gelöst zu haben !!! Legende! – Mitchell

+0

Gern geschehen. Meine Kommentare jetzt löschen, um aufzuräumen ... –

+0

Wenn ich diesen Befehl für die über 5000 Einträge ausführe, die ich in meiner Datei habe, erhalte ich eine Fehlermeldung mit dem Hinweis '' fatal: kann die Pipe nicht öffnen 'curl -s (Zu viele offene Dateien)' ' Irgendeine Idee ist Ed? – Mitchell