Cambiato comportamento AWK? No, dipende da Bash

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4446
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Cambiato comportamento AWK? No, dipende da Bash

Messaggio da UbuNuovo »

Non so perché con la versione 20.04 di Ubuntu Mate il codice AWK non funziona più come prima.

Codice: Seleziona tutto

8-) uname -a
Linux ubunuovo-E5 5.4.0-71-generic #79-Ubuntu SMP Wed Mar 24 10:56:57 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
8-) bash --version
GNU bash, versione 5.0.17(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2019 Free Software Foundation, Inc.
Licenza GPLv3+: GNU GPL versione 3 o successiva <http://gnu.org/licenses/gpl.html>
...
8-) awk --version
GNU Awk 5.0.1, API: 2.0 (GNU MPFR 4.0.2, GNU MP 6.2.0)
Copyright (C) 1989, 1991-2019 Free Software Foundation.
...


Ho una file, in cui imposto i dati per mezzo di vari array php, che chiamerò dati.php.
Da questo file devo estrarre il blocco di testo che segue, per poi trasformarlo in un array bash.

Codice: Seleziona tutto

...
$dati_gare=array(
'1|28 Marzo 2021|Qatar|Losail|5,380',
'2|04 Aprile 2021|Qatar|Losail II|5,380',
'3|18 Aprile 2021|Portugal|Algarve|4,653',
'4|02 Maggio 2021|Spagna|Jerez|4,423',
'5|16 Maggio 2021|Francia|Le Mans|4,185',
'6|30 Maggio 2021|Italia|Mugello Adriatico|5,245',
'7|06 Giugno 2021|Catalunya|Montmelò|4,655',
'8|20 Giugno 2021|Germania|Sachsenring|3,671',
'9|27 Giugno 2021|Olanda|Assen|4,542',
'10|11 Luglio 2021|Finlandia|KymiRing|4,650',
'11|15 Agosto 2021|Austria|Spielberg|4,216',
'12|29 Agosto 2021|Gran Bretagna|Silverstone|5,900',
'13|12 Settembre 2021|Spagna|Aragona|5,078',
'14|19 Settembre 2021|San Marino|Misano|4,226',
'15|03 Ottobre 2021|Giappone|Motegi|4,801',
'16|10 Ottobre 2021|Tailandia|Chang|4,554',
'17|24 Ottobre 2021|Australia|Phillip Island|4,448',
'18|31 Ottobre 2021|Malesia|Sepang|5,543',
'19|14 Novembre 2021|Spagna|Ricardo Tormo|4,005'
);
...
Per non importare le variabili in awk e non usare i doppi apici usavo il codice che segue,
(con escape di: parentesi tonde, dollaro e "punto e virgola"):

Codice: Seleziona tutto

inizio_esc='\$dati_gare=array\('
fine_esc='\)\;'
awk '/^'$inizio_esc'$/,/'$fine_esc'/' 'dati.php' | sed '1d;$d;s/,//g'
se eseguo il codice ottengo l'errore:

Codice: Seleziona tutto

awk: riga com.:1: /\^\$dati_gare=array\(\$/\,/\)\;/
awk: riga com.:1:                          ^ la barra inversa non è l'ultimo carattere della riga
awk: riga com.:1: /\^\$dati_gare=array\(\$/\,/\)\;/
awk: riga com.:1:                          ^ syntax error
8-) 
I dati non sono sbagliati, con sed funziona regolarmente (senza bisogno di escape)

Codice: Seleziona tutto

8-) inizio='$dati_gare=array('
8-) fine=');'
8-) sed -n "/$inizio/,/$fine/p" dati.php | sed '1d;$d;s/,//g'
'1|28 Marzo 2021|Qatar|Losail|5380'
'2|04 Aprile 2021|Qatar|Losail II|5380'
'3|18 Aprile 2021|Portugal|Algarve|4653'
'4|02 Maggio 2021|Spagna|Jerez|4423'
'5|16 Maggio 2021|Francia|Le Mans|4185'
'6|30 Maggio 2021|Italia|Mugello Adriatico|5245'
'7|06 Giugno 2021|Catalunya|Montmelò|4655'
'8|20 Giugno 2021|Germania|Sachsenring|3671'
'9|27 Giugno 2021|Olanda|Assen|4542'
'10|11 Luglio 2021|Finlandia|KymiRing|4650'
'11|15 Agosto 2021|Austria|Spielberg|4216'
'12|29 Agosto 2021|Gran Bretagna|Silverstone|5900'
'13|12 Settembre 2021|Spagna|Aragona|5078'
'14|19 Settembre 2021|San Marino|Misano|4226'
'15|03 Ottobre 2021|Giappone|Motegi|4801'
'16|10 Ottobre 2021|Tailandia|Chang|4554'
'17|24 Ottobre 2021|Australia|Phillip Island|4448'
'18|31 Ottobre 2021|Malesia|Sepang|5543'
'19|14 Novembre 2021|Spagna|Ricardo Tormo|4005'
8-) 
se uso i doppi apici, funziona ma ottengo un warning:

Codice: Seleziona tutto

8-) awk "/^$inizio_esc$/,/$fine_esc/" 'dati.php'
awk: riga com.:1: attenzione: la sequenza di protezione `\;' non è un operatore noto per un'espressione regolare
$dati_gare=array(
'1|28 Marzo 2021|Qatar|Losail|5,380',
'2|04 Aprile 2021|Qatar|Losail II|5,380',
'3|18 Aprile 2021|Portugal|Algarve|4,653',
...
se importo le variabili di inizio e fine da bash:

Codice: Seleziona tutto

inizio_esc='\$dati_gare=array\('
fine_esc='\)\;'
awk -v inizio="$inizio_esc" -v fine="$fine_esc" '/^inizio$/,/fine/' 'dati.php'
eseguo

Codice: Seleziona tutto

8-) awk -v inizio="$inizio_esc" -v fine="$fine_esc" '/^inizio$/,/fine/' 'dati.php'
awk: attenzione: sequenza di protezione `\$' considerata come semplice `$'
awk: attenzione: sequenza di protezione `\(' considerata come semplice `('
awk: attenzione: sequenza di protezione `\)' considerata come semplice `)'
awk: attenzione: sequenza di protezione `\;' considerata come semplice `;'
8-)
Gli risponderei "Attenzione: Lo so! È quello che voglio!" :devilmad:

Provo ad usare le stringhe senza escape ed importare le variabili

Codice: Seleziona tutto

inizio='$dati_gare=array('
fine=');'
awk -v inizio="$inizio" -v fine="$fine" '/^inizio$/,/fine/' 'dati.php'
eseguo:

Codice: Seleziona tutto

8-) inizio='$dati_gare=array('
8-) fine=');'
8-) awk -v inizio="$inizio" -v fine="$fine" '/^inizio$/,/fine/' 'dati.php'
8-) 
Niente! :devilmad:

Qualcuno ha voglia di provare?
Tanto per sapere se è qualcosa che non funziona a me oppure è normale.

Edit: Da altre prove sembra che sia la shell a mettere un escape senza motivo.

Con le stringhe reali:

Stranamente funziona facendo l'escape della prima parentesi, per la seconda parentesi è indifferente

Codice: Seleziona tutto

8-) awk '/\$dati_gare=array\(/,/);/' 'dati.php'
$dati_gare=array(
'1|28 Marzo 2021|Qatar|Losail|5,380',
'2|04 Aprile 2021|Qatar|Losail II|5,380',
'3|18 Aprile 2021|Portugal|Algarve|4,653',
...

8-) awk '/\$dati_gare=array\(/,/\);/' 'dati.php'
$dati_gare=array(
'1|28 Marzo 2021|Qatar|Losail|5,380',
'2|04 Aprile 2021|Qatar|Losail II|5,380',
'3|18 Aprile 2021|Portugal|Algarve|4,653',
...
con le variabili in teoria dovrebbe funzionare

Codice: Seleziona tutto

inizio='\$dati_gare=array\('
fine='\);'
awk '/'$inizio'/,/'$fine'/' 'dati.php'
8-) awk '/'$inizio'/,/'$fine'/' 'dati.php'
awk: riga com.:1: /\$dati_gare=array\(/\,/\);/
awk: riga com.:1:                      ^ la barra inversa non è l'ultimo carattere della riga
awk: riga com.:1: /\$dati_gare=array\(/\,/\);/
awk: riga com.:1:                      ^ syntax error
se guardo l'espansione della shell sembra regolare

Codice: Seleziona tutto

8-) echo "awk '/'$inizio'/,/'$fine'/' 'dati.php'"
awk '/'\$dati_gare=array\('/,/'\);'/' 'dati.php'
con echo senza doppi apici però:

Codice: Seleziona tutto

8-) echo awk '/'$inizio'/,/'$fine'/' 'dati.php'
awk /\$dati_gare=array\(/\,/\);/ dati.php
awk /\$dati_gare=array\(/\,/\);/ dati.php[/code]
la shell fa l'escape della virgola! Perché????
Ultima modifica di UbuNuovo il domenica 18 aprile 2021, 20:45, modificato 1 volta in totale.
Salva l'Ucraina! 🇺🇦
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4446
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Cambiato comportamento AWK

Messaggio da UbuNuovo »

L'escape del punto e virgola non serve, non ricordo perché l'avevo messo, lo script lo scrissi ne 2014.
Di sicuro il problema dipende dalla shell non da AWK.

Eseguendo il codice seguente con shell diverse ottengo l'errore solo con bash; con zsh e dash nessun errore o warning.

Codice: Seleziona tutto

inizio_esc='\$dati_gare=array\('
fine_esc='\);'
awk '/^'$inizio_esc'$/,/'$fine_esc'/' 'dati.php'

Se qualcuno prova ed ottiene lo stesso errore e non ha spiegazioni che lo giustifichi, lo considero un bug e lo segnalo.
Ultima modifica di UbuNuovo il domenica 18 aprile 2021, 21:46, modificato 1 volta in totale.
Salva l'Ucraina! 🇺🇦
Avatar utente
vaeVictis
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4703
Iscrizione: venerdì 27 luglio 2012, 17:58
Desktop: Gnome
Distribuzione: Ubuntu 20.04 64bit

Re: Cambiato comportamento AWK? No, dipende da Bash

Messaggio da vaeVictis »

Con calma nei prossimi giorni ti prometto che controllo. Senza che rileggo meglio ora ché sono stanco, ma immagino di sì, hai fornito tutto per riprodurre il problema?
Pirates arrrrrrrrrrr awesome!!!
«I fear not the man who has practiced 10000 kicks once,
but I fear the man who has practiced one kick 10000 times.»
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4446
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: Cambiato comportamento AWK? No, dipende da Bash

Messaggio da UbuNuovo »

Sì, il contenuto del file dati.php è all'inizio, poi serve il codice del post precedente.
Grazie ;)

Anzi la parte con sed non ha importanza, la levo.
Salva l'Ucraina! 🇺🇦
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 26 ospiti