Copiare una linea e incollarla dopo un match

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Tapiocapioca
Prode Principiante
Messaggi: 95
Iscrizione: mercoledì 23 gennaio 2008, 18:05

Copiare una linea e incollarla dopo un match

Messaggio da Tapiocapioca »

Perdonatemi se scrivo in una maniera da profano, ma lo sono. :D

Ho un grosso file xml contenente la programmazione televisiva di svariati giorni, è strutturato così:

Codice: Seleziona tutto

    <channel id="Rai 1 HD">
        <display-name lang="it">Rai 1 HD</display-name>
        <icon src="http://www.mio_sito.com/logos/Rai1.it.png"/>
    </channel>
    <channel id="Rai 1 +1HD">
        <display-name lang="it">Rai 1 +1HD</display-name>
    </channel>
        <channel id="Rai 1 +2HD">
        <display-name lang="it">Rai 1 +2HD</display-name>
    </channel>
    <channel id="Rai 2 HD">
        <display-name lang="it">Rai 2 HD</display-name>
        <icon src="http://www.mio_sito.com/logos/Rai2.it.png"/>
    </channel>
    <channel id="Rai 2 +1HD">
        <display-name lang="it">Rai 2 +1HD</display-name>
    </channel>
        <channel id="Rai 2 +2HD">
        <display-name lang="it">Rai 2 +2HD</display-name>
    </channel>
Dovrei modificare il file come segue.

Codice: Seleziona tutto

   <channel id="Rai 1 HD">
        <display-name lang="it">Rai 1 HD</display-name>
        <icon src="http://www.mio_sito.com/logos/Rai1.it.png"/>
    </channel>
    <channel id="Rai 1 +1HD">
        <display-name lang="it">Rai 1 +1HD</display-name>
        <icon src="http://www.mio_sito.com/logos/Rai1.it.png"/>
    </channel>
        <channel id="Rai 1 +2HD">
        <display-name lang="it">Rai 1 +2HD</display-name>
        <icon src="http://www.mio_sito.com/logos/Rai1.it.png"/>
    </channel>
    <channel id="Rai 2 HD">
        <display-name lang="it">Rai 2 HD</display-name>
        <icon src="http://www.mio_sito.com/logos/Rai2.it.png"/>
    </channel>
    <channel id="Rai 2 +1HD">
        <display-name lang="it">Rai 2 +1HD</display-name>
        <icon src="http://www.mio_sito.com/logos/Rai2.it.png"/>
    </channel>
        <channel id="Rai 2 +2HD">
        <display-name lang="it">Rai 2 +2HD</display-name>
        <icon src="http://www.mio_sito.com/logos/Rai2.it.png"/>
    </channel>

Ho fatto delle prove ma non so che pesci prendere, fino ad ora ho provato ad ottenere questo risultato con il comando awk senza successo.

Grazie a chi vorrà aiutarmi!
Avatar utente
bingel
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4026
Iscrizione: lunedì 3 aprile 2006, 10:17

Re: Copiare una linea e incollarla dopo un match

Messaggio da bingel »

Forse conviene che illustri le differenze perché io alla terza riga mi sono già "scoraggiato".
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: Copiare una linea e incollarla dopo un match

Messaggio da crap0101 »

in pratica aggiungere l'icona a gli elementi che non le hanno?

Se vuoi usare awk potresti provare una strada dl genere:

Codice: Seleziona tutto

crap0101@orange:/tmp/foo$ cat x.awk

BEGIN {
    logo_lines[1] = "<icon src=\"http://www.mio_sito.com/logos/Rai1.it.png\"/>"
    logo_lines[2] = "<icon src=\"http://www.mio_sito.com/logos/Rai2.it.png\"/>"
    new_line = ""
    new_indent = ""
}

match($0, /\s+<channel id="Rai ([0-9])/, a) {
    new_line = logo_lines[a[1]]
    split($0, a, "<")
    new_indent = a[1]
}

match($0, /\s+<icon src=/, a) {
    new_line = ""
}

$1 ~ /<\/channel>/ && new_line ~ /.+/ {
    printf "%s%s\n", new_indent, new_line
    new_line = ""
    new_indent = ""
}

{ print $0 }
crap0101@orange:/tmp/foo$ diff -Naur a c
--- a	2017-01-22 18:09:28.086997979 +0100
+++ c	2017-01-22 19:55:13.026852901 +0100
@@ -4,9 +4,11 @@
     </channel>
     <channel id="Rai 1 +1HD">
         <display-name lang="it">Rai 1 +1HD</display-name>
+    <icon src="http://www.mio_sito.com/logos/Rai1.it.png"/>
     </channel>
         <channel id="Rai 1 +2HD">
         <display-name lang="it">Rai 1 +2HD</display-name>
+        <icon src="http://www.mio_sito.com/logos/Rai1.it.png"/>
     </channel>
     <channel id="Rai 2 HD">
         <display-name lang="it">Rai 2 HD</display-name>
@@ -14,7 +16,9 @@
     </channel>
     <channel id="Rai 2 +1HD">
         <display-name lang="it">Rai 2 +1HD</display-name>
+    <icon src="http://www.mio_sito.com/logos/Rai2.it.png"/>
     </channel>
         <channel id="Rai 2 +2HD">
         <display-name lang="it">Rai 2 +2HD</display-name>
+        <icon src="http://www.mio_sito.com/logos/Rai2.it.png"/>
     </channel>
bingel ha scritto:Forse conviene che illustri le differenze perché io alla terza riga mi sono già "scoraggiato".
anche... btw diff aiuta in questi casi ;-)
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Avatar utente
bingel
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4026
Iscrizione: lunedì 3 aprile 2006, 10:17

Re: Copiare una linea e incollarla dopo un match

Messaggio da bingel »

Mi servirebbe una forte spinta motivazionale per mettermi a ricopiare tutto in due files e fare un diff ...soprattutto scrivendo da cellulare.
Tapiocapioca
Prode Principiante
Messaggi: 95
Iscrizione: mercoledì 23 gennaio 2008, 18:05

Re: Copiare una linea e incollarla dopo un match

Messaggio da Tapiocapioca »

bingel [url=http://forum.ubuntu-it.org/viewtopic.php?p=4952465#p4952465][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:Forse conviene che illustri le differenze perché io alla terza riga mi sono già "scoraggiato".
In pratica esiste un canale principale che ha una icona e i suoi alias che non la hanno. Bisognerebbe aggiungere l'icona sui seguenti alias, cosa di per se facile se l'icona non cambiasse mai, solo che ogni canale l'icona cambia e io non ho la minima idea di come popolare una variabile correttamente per awk.
Tapiocapioca
Prode Principiante
Messaggi: 95
Iscrizione: mercoledì 23 gennaio 2008, 18:05

Re: Copiare una linea e incollarla dopo un match

Messaggio da Tapiocapioca »

crap0101 [url=http://forum.ubuntu-it.org/viewtopic.php?p=4952468#p4952468][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:in pratica aggiungere l'icona a gli elementi che non le hanno?

Se vuoi usare awk potresti provare una strada dl genere:

Codice: Seleziona tutto

crap0101@orange:/tmp/foo$ cat x.awk

BEGIN {
    logo_lines[1] = "<icon src=\"http://www.mio_sito.com/logos/Rai1.it.png\"/>"
    logo_lines[2] = "<icon src=\"http://www.mio_sito.com/logos/Rai2.it.png\"/>"
    new_line = ""
    new_indent = ""
}

match($0, /\s+<channel id="Rai ([0-9])/, a) {
    new_line = logo_lines[a[1]]
    split($0, a, "<")
    new_indent = a[1]
}

match($0, /\s+<icon src=/, a) {
    new_line = ""
}

$1 ~ /<\/channel>/ && new_line ~ /.+/ {
    printf "%s%s\n", new_indent, new_line
    new_line = ""
    new_indent = ""
}

{ print $0 }
crap0101@orange:/tmp/foo$ diff -Naur a c
--- a	2017-01-22 18:09:28.086997979 +0100
+++ c	2017-01-22 19:55:13.026852901 +0100
@@ -4,9 +4,11 @@
     </channel>
     <channel id="Rai 1 +1HD">
         <display-name lang="it">Rai 1 +1HD</display-name>
+    <icon src="http://www.mio_sito.com/logos/Rai1.it.png"/>
     </channel>
         <channel id="Rai 1 +2HD">
         <display-name lang="it">Rai 1 +2HD</display-name>
+        <icon src="http://www.mio_sito.com/logos/Rai1.it.png"/>
     </channel>
     <channel id="Rai 2 HD">
         <display-name lang="it">Rai 2 HD</display-name>
@@ -14,7 +16,9 @@
     </channel>
     <channel id="Rai 2 +1HD">
         <display-name lang="it">Rai 2 +1HD</display-name>
+    <icon src="http://www.mio_sito.com/logos/Rai2.it.png"/>
     </channel>
         <channel id="Rai 2 +2HD">
         <display-name lang="it">Rai 2 +2HD</display-name>
+        <icon src="http://www.mio_sito.com/logos/Rai2.it.png"/>
     </channel>
bingel ha scritto:Forse conviene che illustri le differenze perché io alla terza riga mi sono già "scoraggiato".
anche... btw diff aiuta in questi casi ;-)
O mamma, sei un genio per quanto mi riguarda :P
Comunque il problema è esattamente quello che hai detto. Devo aggiungere l'icona che manca sugli alias del canale "padre".
In realtà non ho l'esigenza di usare awk, se conosci una strada più semplice va bene lo stesso, anzi meglio. Nel frattempo provo a comprendere quello che hai scritto :D :D

EDIT: Leggendo bene forse sarebbe meglio qualcosa di più generico i canali sono tanti e non vorrei dover ricopiare tutti i link, ti allego il file per farti capire di che cosa stiamo parlando, i canali sono circa 300 e hanno tutti nomi diversi :( :(

File XML
Avatar utente
crap0101
Rampante Reduce
Rampante Reduce
Messaggi: 8242
Iscrizione: martedì 30 ottobre 2007, 6:33
Desktop: LXDE
Distribuzione: Ubuntu 18.04.1 LTS
Sesso: Maschile
Località: TO
Contatti:

Re: Copiare una linea e incollarla dopo un match

Messaggio da crap0101 »

allora bisogna aggiungere un pezzo in modo da sostituire le statiche " logo_lines[...]" del mio esempio, in modo da individuare gli url da utilizzare; inoltre bisognerebbe (magari desumere da questi ultimi) le stringhe con cui fare il match... se sono centinaia di canali probabilmente ti conviene ottenere queste informazioni con uno script a parte, in modo che siano più facilmente gestibili (dubito che dai nomi/url così come sono si riesca comodamente a ottenere risultati infallibili)
http://www.gnu.org/ http://boinc.berkeley.edu/ http://www.python-it.org/
- Ricorda le ultime parole di suo padre: «Sta' alla larga dalle chiese, figlio. La sola cosa per cui hanno la chiave è il merdaio. E giurami che non porterai mai un distintivo della legge» - W.S. Burroughs
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 18 ospiti