Precedente: Commenti, Su: Eseguire gawk [Contenuti][Indice]
• Doppi apici in DOS | Passaggio di apici in file .BAT Windows. |
Per programmi awk
di lunghezza da corta a media spesso conviene
digitare il programma sulla riga di comando awk
.
La maniera migliore per farlo è racchiudere l’intero programma tra apici
singoli.
Questo vale sia che si digiti il programma interattivamente su
richiesta della shell, sia che lo si scriva come parte di uno script
di shell di maggiori dimensioni:
awk 'testo del programma' input-file1 input-file2 …
Quando si lavora con la shell, non guasta avere una conoscenza di base sulle regole per l’uso di apici nella shell. Le regole seguenti valgono solo per shell in stile Bourne (come Bash, la Bourne-Again shell). Se si usa la C shell, si avranno regole differenti.
Prima di immergerci nelle regole, introduciamo un concetto che ricorre in tutto questo Documento, che è quello della stringa null, o vuota.
La stringa nulla è una variabile, di tipo carattere, che non ha un valore.
In altre parole, è vuota. Nei programmi awk
si scrive così:
""
. Nella shell la si può scrivere usando apici sia singoli
che doppi: ""
oppure ''
. Sebbena la stringa nulla non contenga
alcun carattere, essa esiste lo stesso. Si consideri questo comando:
$ echo ""
Qui, il comando echo
riceve un solo argomento, anche se
quell’argomento non contiene alcun carattere. Nel resto di questo
Documento, usiamo indifferentemente i termini stringa nulla
e stringa vuota. Ora, proseguiamo con le regole relative agli apici:
gawk
.
un esempio di cosa succede se si prova a farlo.
Poiché alcuni caratteri all’interno di un testo racchiuso tra doppi apici sono interpretati dalla shell, essi devono essere protetti all’interno del testo stesso. Sono da tener presenti i caratteri ‘$’, ‘`’, ‘\’, e ‘"’, tutti i quali devono essere preceduti da una barra inversa quando ricorrono all’interno di un testo racchiuso tra doppi apici, per poter essere passati letteralmente al programma. (La barra inversa viene tolta prima del passaggio al programma.) Quindi, l’esempio visto precedentemente in Senza uso di file in input (input immesso da tastiera):
awk 'BEGIN { print "Non v\47allarmate!" }'
si potrebbe scrivere invece così:
$ awk "BEGIN { print \"Non v'allarmate!\" }" -| Non v'allarmate!
Va notato che l’apice singolo non è speciale all’interno di un testo racchiuso tra doppi apici.
FS
sia
impostato alla stringa nulla, digitare:
awk -F "" 'programma' file # corretto
Non è invece da usare:
awk -F"" 'programma' file # errato!
Nel secondo caso, awk
tenta di usare il nome del programma come
valore di FS
, e il primo nome-file come testo del programma!
Ciò come minimo genera un errore di sintassi, e un comportamento confuso nel
caso peggiore.
Mischiare apici singoli e doppi è difficile. Occorre utilizzare trucchi della shell per gli apici, come questi:
$ awk 'BEGIN { print "Questo è un apice singolo. <'"'"'>" }' -| Questo è un apice singolo. <'>
Questo programma stampa tre stringhe tra apici concatenate tra loro. La prima e la terza sono rinchiuse tra apici singoli, la seconda tra apici doppi.
Quanto sopra può essere “semplificato” così:
$ awk 'BEGIN { print "Questo è un apice singolo <'\''>" }' -| Questo è un apice singolo <'>
A voi la scelta del più leggibile dei due.
Un’altra opzione è quella di usare doppi apici, proteggendo i doppi apici
inclusi, a livello awk
:
$ awk "BEGIN { print \"Questo è un apice singolo <'>\" }" -| Questo è un apice singolo <'>
Quest’opzione è fastidiosa anche perché il doppio apice, la barra inversa e
il simbolo del dollaro sono molto comuni nei programmi awk
più
avanzati.
Una terza opzione è quella di usare le sequenze ottali equivalenti (vedi la sezione Sequenze di protezione) per i caratteri apice singolo e doppio, così:
$ awk 'BEGIN { print "Questo è un apice singolo <\47>" }' -| Questo è un apice singolo <'> $ awk 'BEGIN { print "Questo è un doppio apice <\42>" }' -| Questo è un doppio apice <">
Questo funziona bene, ma si dovrebbe commentare chiaramente quel che la sequenza di protezione significa.
Una quarta possibilità è di usare assegnamenti di variabili sulla riga di comando, così:
$ awk -v sq="'" 'BEGIN { print "Questo è un apice singolo <" sq ">" }' -| Questo è un apice singolo <'>
(Qui, le due stringhe costanti e il valore di sq
sono concatenati in
un’unica stringa che è stampata da print
.)
Se servono veramente sia gli apici singoli che quelli doppi nel proprio
programma awk
, è probabilmente meglio tenerlo in un file separato,
dove la shell non interferisce, e si potrà scrivere quello che si vuole.
Precedente: Commenti, Su: Eseguire gawk [Contenuti][Indice]