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'
);
...
(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'
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-)
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-)
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',
...
Codice: Seleziona tutto
inizio_esc='\$dati_gare=array\('
fine_esc='\)\;'
awk -v inizio="$inizio_esc" -v fine="$fine_esc" '/^inizio$/,/fine/' 'dati.php'
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-)
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'
Codice: Seleziona tutto
8-) inizio='$dati_gare=array('
8-) fine=');'
8-) awk -v inizio="$inizio" -v fine="$fine" '/^inizio$/,/fine/' 'dati.php'
8-)
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',
...
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
Codice: Seleziona tutto
8-) echo "awk '/'$inizio'/,/'$fine'/' 'dati.php'"
awk '/'\$dati_gare=array\('/,/'\);'/' 'dati.php'
Codice: Seleziona tutto
8-) echo awk '/'$inizio'/,/'$fine'/' 'dati.php'
awk /\$dati_gare=array\(/\,/\);/ dati.php
la shell fa l'escape della virgola! Perché????