<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Perl on Melabit</title>
    <link>https://static.233.196.69.159.clients.your-server.de/it/tags/perl/</link>
    <description>Recent content in Perl on Melabit</description>
    <generator>Hugo</generator>
    <language>it</language>
    <lastBuildDate>Mon, 18 Feb 2019 18:00:00 +0000</lastBuildDate>
    <atom:link href="https://static.233.196.69.159.clients.your-server.de/it/tags/perl/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Script per tutti i giorni: entra in scena awk</title>
      <link>https://static.233.196.69.159.clients.your-server.de/it/2019/02/18/script-per-tutti-i-giorni-entra-in-scena-awk/</link>
      <pubDate>Mon, 18 Feb 2019 18:00:00 +0000</pubDate>
      <guid>https://static.233.196.69.159.clients.your-server.de/it/2019/02/18/script-per-tutti-i-giorni-entra-in-scena-awk/</guid>
      <description>&lt;p&gt;&lt;img src=&#34;https://www.viscountinstruments.it/wp-content/uploads/2020/01/ebano_3-600x433.jpg&#34; alt=&#34;&#34;&gt;&#xA;&amp;ndash; &lt;em&gt;&lt;a href=&#34;https://www.viscountinstruments.it/instrument/a-w-k-keyboard/&#34;&gt;Tastiera A.W.K., Viscount Instruments&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Nelle prime tre puntate di questa serie abbiamo imparato a scrivere uno script in &lt;code&gt;bash&lt;/code&gt; per trasformare una stringa di testo in modo che segua delle  convenzioni ben determinate a priori (qui i link alla &lt;a href=&#34;https://melabit.wordpress.com/2018/11/23/script-per-tutti-i-giorni-semplici-modifiche-alle-stringhe-di-testo/&#34;&gt;prima&lt;/a&gt;, &lt;a href=&#34;https://melabit.wordpress.com/2018/12/05/script-per-tutti-i-giorni-dalla-linea-di-comando-al-programma/&#34;&gt;seconda&lt;/a&gt; e &lt;a href=&#34;https://melabit.wordpress.com/2018/12/30/script-per-tutti-i-giorni-shell-e-parametri/&#34;&gt;terza&lt;/a&gt; puntata).&lt;/p&gt;&#xA;&lt;p&gt;In questo caso particolare, la stringa risultante dalla trasformazione deve essere scritta tutta in minuscolo e non deve contenere apostrofi o altri caratteri speciali, a parte il trattino usato come separatore di parole. L&amp;rsquo;idea è quella di usare questa stringa, insieme alla data di pubblicazione del post, per dare un nome standard e facilmente rintracciabile al file Markdown che contiene il testo del post stesso, &lt;a href=&#34;https://melabit.wordpress.com/2018/11/23/script-per-tutti-i-giorni-semplici-modifiche-alle-stringhe-di-testo/&#34;&gt;utilizzando il formato&lt;/a&gt; &lt;code&gt;YYYY-MM-DD-titolo-del-post.md&lt;/code&gt;, dove &lt;code&gt;YYYY&lt;/code&gt; indica l’anno, &lt;code&gt;MM&lt;/code&gt; il mese e &lt;code&gt;DD&lt;/code&gt; il giorno di pubblicazione.&lt;/p&gt;&#xA;&lt;p&gt;L&amp;rsquo;approccio &lt;a href=&#34;https://melabit.wordpress.com/2018/12/30/script-per-tutti-i-giorni-shell-e-parametri/&#34;&gt;seguito finora&lt;/a&gt; è utile per imparare i fondamenti della programmazione in &lt;code&gt;bash&lt;/code&gt;, ma manca decisamente di praticità. Partire dal titolo e dalla data di pubblicazione presenti nell&amp;rsquo;intestazione del post per arrivare al nome completo del file richiede un certo lavoro di copia e incolla fra l&amp;rsquo;editor, il Finder e il Terminale, e gli errori sono sempre in agguato.&lt;/p&gt;&#xA;&lt;p&gt;Quello che ci vuole è uno script che renda il processo completamente automatico, rinominando il file Markdown a partire dal contenuto del documento stesso.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;&#xA;&lt;p&gt;Si potrebbe benissimo fare anche con &lt;code&gt;bash&lt;/code&gt;, ma perché complicarsi la vita quando c&amp;rsquo;è uno strumento fatto apposta per analizzare ed estrarre dei dati dai file di testo?&lt;/p&gt;&#xA;&lt;h4 id=&#34;awk-questo-sconosciuto&#34;&gt;AWK, questo sconosciuto&lt;/h4&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/onetrueawk/awk&#34;&gt;AWK&lt;/a&gt; è un linguaggio di programmazione interpretato sviluppato negli anni &amp;lsquo;70 presso i &lt;a href=&#34;https://it.wikipedia.org/wiki/Bell_Laboratories&#34;&gt;Bell Labs&lt;/a&gt;, il famosissimo centro di ricerca americano che ci ha dato il transistor, il laser, Unix e il C (e moltissimo altro). AWK è stato sviluppato da Alfred Aho, Peter Weinberger e Brian Kernighan, tre grandi studiosi di &lt;em&gt;computer science&lt;/em&gt;, fra i quali spicca il terzo, coautore insieme a Dennis Ritchie di &lt;a href=&#34;https://archive.org/stream/CProgLangBooksCollection/1_TheCProgLang-2ndEd-RitchieKernighan#page/n17/mode/2up&#34;&gt;The C Programming Language&lt;/a&gt;, il volume di riferimento sul linguaggio C, noto anche semplicemente come &amp;ldquo;K&amp;amp;R&amp;rdquo; dai cognomi dei due autori.&lt;/p&gt;&#xA;&lt;p&gt;Alla base di AWK c&amp;rsquo;è l&amp;rsquo;idea di elaborare un file di testo una riga alla volta, controllando che la riga in esame soddisfi una o più condizioni prestabilite ed eseguendo le azioni programmate per ciascuna di queste condizioni&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;    condizione #1: {azione #1}&#xA;    condizione #2: {azione #2}&#xA;    ...&#xA;    condizione #N: {azione #N}   &#xA;    &#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Per AWK un file di testo è costituito da un certo numero di righe (&lt;em&gt;record&lt;/em&gt;), ciascuna delle quali è suddivisa in uno o più campi (&lt;em&gt;field&lt;/em&gt;), separati fra loro da un &lt;em&gt;separatore di campo&lt;/em&gt;, che di default è lo spazio ma che può essere modificato a piacere. Per riferirsi a ciascun campo AWK usa le variabili speciali &lt;code&gt;$1&lt;/code&gt;, &lt;code&gt;$2&lt;/code&gt; e così via, dove il numero indica la posizione del campo all&amp;rsquo;interno della riga. La variabile &lt;code&gt;$0&lt;/code&gt; contiene l&amp;rsquo;intera riga corrente.&lt;/p&gt;&#xA;&lt;p&gt;Tutto qui? Più o meno. C&amp;rsquo;è (quasi) solo da aggiungere che AWK prevede due azioni speciali opzionali, racchiuse fra i blocchi &lt;code&gt;BEGIN {...}&lt;/code&gt;, &lt;code&gt;END {...}&lt;/code&gt;, che servono per eseguire le operazioni preliminari e conclusive necessarie per il buon funzionamento del programma, ad esempio per definire il separatore di campo. Un programma completo in AWK ha quindi una struttura di questo tipo,&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;    BEGIN { istruzione&#xA;            istruzione&#xA;            ....&#xA;          }&#xA;    &#xA;    condizione #1: { istruzione&#xA;                     istruzione&#xA;                     ....&#xA;                   }&#xA;    condizione #2: { istruzione&#xA;                     istruzione&#xA;                     ....&#xA;                   }&#xA;&#xA;    ...&#xA;    condizione #N: { istruzione&#xA;                     istruzione&#xA;                     istruzione&#xA;                     ....&#xA;                   }&#xA;&#xA;     END { istruzione&#xA;           istruzione&#xA;           ....&#xA;         }&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;dove come già detto i blocchi &lt;code&gt;BEGIN {...}&lt;/code&gt;, &lt;code&gt;END {...}&lt;/code&gt; sono opzionali.&lt;/p&gt;&#xA;&lt;p&gt;Nonostante la fama dei suoi autori, AWK è poco utilizzato, molto meno di quanto meriterebbe, i programmatori del mondo UNIX preferiscono usare strumenti più semplici ma meno potenti come &lt;code&gt;sed&lt;/code&gt; (che abbiamo già incontrato nelle &lt;a href=&#34;https://melabit.wordpress.com/2018/11/23/script-per-tutti-i-giorni-semplici-modifiche-alle-stringhe-di-testo/&#34;&gt;puntate&lt;/a&gt; &lt;a href=&#34;https://melabit.wordpress.com/2018/12/05/script-per-tutti-i-giorni-dalla-linea-di-comando-al-programma/&#34;&gt;precedenti&lt;/a&gt;) o il declinante &lt;code&gt;perl&lt;/code&gt;, un linguaggio di manipolazione di file di testo perfetto per i programmatori che mitizzano Tafazzi.&lt;/p&gt;&#xA;&lt;p&gt;AWK invece ha il giusto equilibrio di potenza e semplicità d&amp;rsquo;uso ed è uno strumento perfetto se gli si chiede di fare quello per cui è stato ideato, elaborare informazioni strutturate contenute in file di testo.&lt;/p&gt;&#xA;&lt;p&gt;Per fortuna AWK è installato di default in macOS e in Linux, oltre che in tutti i sistemi operativi basati su UNIX che si trovano in giro, per cui per provarlo basta lanciare il Terminale ed eseguire il comando &lt;code&gt;awk&lt;/code&gt;. In realtà ci sono in giro almeno due versioni diverse di AWK. In macOS è installato &lt;code&gt;awk&lt;/code&gt; &lt;em&gt;liscio&lt;/em&gt;, la versione del linguaggio definita dai tre autori originali nel volume &lt;a href=&#34;https://archive.org/details/pdfy-MgN0H1joIoDVoIC7&#34;&gt;The AWK programming language&lt;/a&gt;. Su Linux, invece, si trova in genere &lt;code&gt;gawk&lt;/code&gt;, una &lt;a href=&#34;https://www.gnu.org/software/gawk/manual/&#34;&gt;implementazione&lt;/a&gt; del linguaggio della Free Software Foundation pienamente compatibile con &lt;code&gt;awk&lt;/code&gt;, a cui sono state aggiunte alcune estensioni piuttosto utili. Installare &lt;code&gt;gawk&lt;/code&gt; su macOS è facile per chi usa &lt;a href=&#34;https://melabit.wordpress.com/2014/04/29/homebrew-software-per-il-mac-fatto-in-casa/&#34;&gt;Homebrew&lt;/a&gt;, dal Terminale&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ brew install gawk&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;Da ora in poi per semplicità farò cadere la distinzione fatta finora fra AWK, il linguaggio di programmazione, e &lt;code&gt;awk&lt;/code&gt;, l&amp;rsquo;interprete del linguaggio, usando sempre e solo il termine awk per riferirmi ad entrambi.&lt;/p&gt;&#xA;&lt;h4 id=&#34;un-programma-banale-in-awk&#34;&gt;Un programma banale in awk&lt;/h4&gt;&#xA;&lt;p&gt;Per avere una idea di cosa può fare awk, ecco un piccolissimo (e rozzo) programma di esempio,&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;BEGIN { FS = &amp;#34;,&amp;#34;&#xA;        OFS = &amp;#34;, &amp;#34;&#xA;      }&#xA;&#xA;$1 ~ /Violanda/ { $1 = &amp;#34;Jolanda&amp;#34; }&#xA;                { print $2, $1, $3, $6, $4, $5 }&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;che applicato ad un elenco di indirizzi come questo,&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;NOME,COGNOME,INDIRIZZO,LOCALITA,PROVINCIA,CAP&#xA;Massino,Nardini,Via Roma 8,Grana,AT,14031&#xA;Primo,Sabbatini,Via C. Cattaneo 50,Cala di Volpe,SS,07020&#xA;Giuseppe,Marino,Via C. Alberto 75,Barni,CO,22030&#xA;Ivano,Costa,Via Guantai Nuovi 29,Ischia,NA,80077&#xA;Margherita,Davide,Via Nuova Agnano 83,Rufina,FI,50068&#xA;Daphne,Lettiere,Via R. Conforti 67,Castel Di Ieri,AQ,67020&#xA;Violanda,Lori,Via A. Manzoni 101,Parona,PV,27020&#xA;Luigia,Cremonesi,Via Castelfidardo 145,Cittadella Del Capo,CS,87020&#xA;Fiore,Mucciano,Via Valpantena 120,Buccino Stazione,SA,84020&#xA;Sandra,Greco,Via Pisanelli 140,Castiglione D&amp;#39;Adda,LO,26823&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;scambia la posizione del nome e del cognome e sposta il CAP prima della Località in tutte le righe del file. Già che c&amp;rsquo;è, corregge anche il nome sbagliato &amp;ldquo;Violanda&amp;rdquo; e lo trasforma in &amp;ldquo;Jolanda&amp;rdquo;. Nella riga #5, &lt;code&gt;$1 ~ /Violanda/&lt;/code&gt; è la condizione, e &lt;code&gt;{$1 = &amp;quot;Jolanda&amp;quot;}&lt;/code&gt; l&amp;rsquo;azione relativa, mentre nella riga #6 la condizione è vuota e quindi l&amp;rsquo;azione conseguente &lt;code&gt;{print $2, $1, $3, $6, $4, $5}&lt;/code&gt; si applica a tutte le righe del file. Il blocco &lt;code&gt;BEGIN {...}&lt;/code&gt; serve per definire il carattere (o i caratteri) che separa i campi contenuti in ciascuna riga letta o scritta dal programma: la variabile predefinita &lt;code&gt;FS&lt;/code&gt; è il separatore dei campi del file di input (quello letto dal programma), &lt;code&gt;OFS&lt;/code&gt; è il separatore dei campi delle righe stampate dallo script.&lt;/p&gt;&#xA;&lt;p&gt;Per provarlo, copiate il programma in un editor e salvatelo come &lt;code&gt;swap.awk&lt;/code&gt;, poi copiate la lista di indirizzi e salvatela come &lt;code&gt;address.csv&lt;/code&gt; (meglio se salvate i due file nella cartella &lt;code&gt;~/Development&lt;/code&gt;, &lt;a href=&#34;https://melabit.wordpress.com/2018/12/30/script-per-tutti-i-giorni-shell-e-parametri/&#34;&gt;ricordate&lt;/a&gt;?). Infine lanciate il Terminale, eseguite il comando&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ awk -f swap.awk address.csv &#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;e vedete cosa viene fuori. Provate a cambiare &lt;code&gt;OFS&lt;/code&gt; e a vedere che succede.&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Domanda 1: Come si fa a lanciare lo script senza dover premettere il comando &lt;code&gt;awk&lt;/code&gt;?&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Domanda 2: Se si rimuove la variabile &lt;code&gt;FS&lt;/code&gt; dal blocco &lt;code&gt;BEGIN{...}&lt;/code&gt; lo script continua a funzionare correttamente?&lt;/em&gt;&lt;/p&gt;&#xA;&lt;p&gt;Ma basta con awk. Questo articolo non vuole essere una introduzione al linguaggio ma vuole solo mostrare come si può risolvere con AWK il problema che ci sta a cuore. Chi volesse è approfondire la conoscenza del linguaggio può consultare i volumi e le guide online riportate in bibliografia.&lt;/p&gt;&#xA;&lt;h4 id=&#34;rinominare-automaticamente-un-post&#34;&gt;Rinominare automaticamente un post&lt;/h4&gt;&#xA;&lt;p&gt;E finalmente eccoci al programma &lt;code&gt;awk&lt;/code&gt; che rinomina da solo il file Markdown di un post in base al titolo e alla data contenuti nei &lt;a href=&#34;https://melabit.wordpress.com/2018/11/23/script-per-tutti-i-giorni-semplici-modifiche-alle-stringhe-di-testo/&#34;&gt;metadati del documento&lt;/a&gt;, che contengono, fra l&amp;rsquo;altro, il titolo, la data di pubblicazione, la categoria e i tag associati al post stesso.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;BEGIN { FS = &amp;#34; &amp;#34;&#xA;        OFS = &amp;#34;-&amp;#34;&#xA;        EXT = &amp;#34;.md&amp;#34;&#xA;      }&#xA;&#xA;$1 ~ /[Dd]ate:/   { date = $2 }&#xA;$1 ~ /[Tt]itle:/  { title = &amp;#34;&amp;#34;&#xA;                    for (i = 2; i &amp;lt;= NF; i++) {&#xA;                        title = title FS tolower($i)&#xA;                    }&#xA;                  }&#xA;&#xA;END { newfilename = date OFS title&#xA;      gsub(&amp;#34;[[:cntrl:]]&amp;#34;, &amp;#34;&amp;#34;, newfilename)&#xA;      gsub(&amp;#34;[\&amp;#34;]+&amp;#34;, &amp;#34;&amp;#34;, newfilename)&#xA;      gsub(&amp;#34;[\.,;:!\?&amp;amp;\$]+&amp;#34;, &amp;#34;&amp;#34;, newfilename)&#xA;      gsub(&amp;#34;[-| ]+&amp;#34;, &amp;#34;-&amp;#34;, newfilename)&#xA;      newfilename = newfilename EXT&#xA;      system(&amp;#34;mv &amp;#34; FILENAME &amp;#34; &amp;#34; newfilename)&#xA;    }&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Riassumo brevemente cosa fa il programma, chi non fosse interessato può saltare direttamente al prossimo paragrafo. La prima condizione &lt;code&gt;$1 ~ /[Dd]ate/&lt;/code&gt; cerca la stringa &lt;code&gt;date:&lt;/code&gt; (indifferentemente in minuscolo o maiuscolo) nel primo campo di tutte le righe del post e quando la trova assegna il secondo campo, corrispondente alla data, alla variabile &lt;code&gt;date&lt;/code&gt;.&#xA;La seconda condizione fa lo stesso per il titolo e lo assegna alla variabile &lt;code&gt;title&lt;/code&gt;. Poiché il titolo è distribuito su un numero imprecisato di campi (ricordo che il separatore di campo &lt;code&gt;FS&lt;/code&gt; è lo spazio), viene utilizzato un ciclo &lt;code&gt;for&lt;/code&gt; per leggere ed aggiungere in successione a &lt;code&gt;title&lt;/code&gt; tutti i campi della riga successivi al primo. Il numero di campi presenti nella riga del titolo è contenuto nella variabile di sistema &lt;code&gt;NF&lt;/code&gt;, aggiornata automaticamente dall&amp;rsquo;interprete ogni volta che viene letta una nuova riga.&#xA;La parte finale del programma, racchiusa nel blocco &lt;code&gt;END {...}&lt;/code&gt;, si occupa di definire la variabile &lt;code&gt;newfilename&lt;/code&gt;, contenente il nuovo nome da assegnare al file, e di trasformarla secondo le regole desiderate.&#xA;La variabile &lt;code&gt;newfilename&lt;/code&gt; contiene inizialmente (riga #12) la data e il titolo letti nel post, separati da un trattino (il valore di &lt;code&gt;OFS&lt;/code&gt;). Nelle quattro righe successive viene utilizzata la funzione &lt;code&gt;gsub&lt;/code&gt; per rimuovere da questa variabile tutti i caratteri indesiderati (caratteri di controllo, virgolette, punteggiatura) e per sostituire spazi e trattini (anche multipli) con un trattino singolo. Alla riga #17 viene aggiunta l&amp;rsquo;estensione definita in &lt;code&gt;EXT&lt;/code&gt;, mentre l&amp;rsquo;ultima riga del blocco effettua una chiamata al sistema operativo per rinominare effettivamente il file, utilizzando un&amp;rsquo;altra variabile di sistema, &lt;code&gt;FILENAME&lt;/code&gt;, che contiene il nome originale del file Markdown su cui sta operando lo script.&lt;/p&gt;&#xA;&lt;p&gt;Salviamo il programma nella solita cartella &lt;code&gt;Development&lt;/code&gt; con il nome &lt;code&gt;setpostname.awk&lt;/code&gt;. Per provarlo dobbiamo avere anche un file Markdown contenente nell&amp;rsquo;intestazione (&lt;em&gt;header&lt;/em&gt;) almeno i metadati relativi al titolo e alla data. Possiamo prendere la prima parte di questo post,&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;---&#xA;layout: post  &#xA;title: &amp;#34;Script per tutti i giorni: entra in scena awk&amp;#34;  &#xA;author:&#x9;Sabino Maggi  &#xA;date: 2019-02-18T18:00:00  &#xA;categories:  &#xA;  - programmazione  &#xA;tags:  &#xA;  - awk  &#xA;  - bash  &#xA;  - editor  &#xA;  - gawk  &#xA;  - perl  &#xA;  - script  &#xA;  - terminale  &#xA;comments: true  &#xA;sidebar: true  &#xA;toc: true  &#xA;published: 2019-02-18T18:00:00  &#xA;slug:  &#xA;&#xA;---&#xA;&#xA;Nelle prime tre puntate di questa serie abbiamo imparato a scrivere uno script in `bash` per trasformare una stringa di testo in modo che segua delle  convenzioni ben determinate a priori (qui i link alla [prima](https://melabit.wordpress.com/2018/11/23/script-per-tutti-i-giorni-semplici-modifiche-alle-stringhe-di-testo/), [seconda](https://melabit.wordpress.com/2018/12/05/script-per-tutti-i-giorni-dalla-linea-di-comando-al-programma/) e [terza](https://melabit.wordpress.com/2018/12/30/script-per-tutti-i-giorni-shell-e-parametri/) puntata).&#xA;&#xA;In questo caso particolare,...&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;e salvarlo con un nome qualsiasi nella stessa cartella &lt;code&gt;Development&lt;/code&gt;. Poiché la fantasia fa difetto, chiamiamolo &lt;code&gt;articolo.md&lt;/code&gt;. A questo punto lanciamo il Terminale, spostiamoci nella cartella &lt;code&gt;Development&lt;/code&gt;&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$ cd ~/Development&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;e lanciamo lo script in &lt;code&gt;awk&lt;/code&gt; con il comando&lt;/p&gt;&#xA;&lt;pre&gt;&lt;code&gt;$  /usr/bin/awk -f setpostname.awk articolo.md&#xA;&lt;/code&gt;&lt;/pre&gt;&#xA;&lt;p&gt;e voilà, il file &lt;code&gt;articolo.md&lt;/code&gt; viene rinominato automaticamente in &lt;code&gt;2019-02-18-script-per-tutti-i-giorni-entra-in-scena-awk&lt;/code&gt;, che è esattamente quello che volevamo. Nota per i più curiosi:  dato che &lt;code&gt;awk&lt;/code&gt; ha bisogno di sapere sia il nome dello script contenente i comandi che quello del file da elaborare, si usa l&amp;rsquo;opzione &lt;code&gt;-f&lt;/code&gt; per indicare esplicitamente lo script con i comandi.&lt;/p&gt;&#xA;&lt;p&gt;Perché uso l&amp;rsquo;intero percorso &lt;code&gt;/usr/bin/awk&lt;/code&gt; per richiamare &lt;code&gt;awk&lt;/code&gt;? Semplicemente perché voglio essere sicuro di utilizzare l&amp;rsquo;interprete &lt;code&gt;awk&lt;/code&gt; presente di default in macOS e non la versione estesa installata tramite Homebrew, che funziona in modo leggermente diverso e darebbe degli avvertimenti poco incomprensibili, pur riuscendo lo stesso a rinominare correttamente il file.&lt;/p&gt;&#xA;&lt;h4 id=&#34;conclusioni&#34;&gt;Conclusioni&lt;/h4&gt;&#xA;&lt;p&gt;Ormai siamo quasi a posto con la rinominazione automatica di un post in Markdown (che poi in effetti è solo una scusa per gettare le basi e per poter affrontare script complessi e più utili). Manca solo un piccolissimo dettaglio, che può far diventare questo script del tutto indistinguibile dai comandi standard del sistema operativo e che sarà l&amp;rsquo;argomento della prossima puntata.&lt;/p&gt;&#xA;&lt;h4 id=&#34;bibliografia&#34;&gt;Bibliografia&lt;/h4&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Alfred Aho, Brian Kernighan, Peter Weinberger, &lt;a href=&#34;https://archive.org/details/pdfy-MgN0H1joIoDVoIC7&#34;&gt;The AWK programming language&lt;/a&gt;, Addison-Wesley, 1988.&lt;/li&gt;&#xA;&lt;li&gt;Arnold Robbins, &lt;a href=&#34;https://www.gnu.org/software/gawk/manual/&#34;&gt;Gawk: Effective AWK Programming&lt;/a&gt;, Edition 4.2, 2018.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;http://matt.might.net/articles/sculpting-text/&#34;&gt;Sculpting text with regex, grep, sed, awk, emacs and vim&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Wikibooks, &lt;a href=&#34;https://en.wikibooks.org/wiki/An_Awk_Primer&#34;&gt;An Awk Primer&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Bruce Barnett, &lt;a href=&#34;http://www.grymoire.com/Unix/Awk.html&#34;&gt;Awk a Tutorial and Introduction&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Tutorials Point, &lt;a href=&#34;https://www.tutorialspoint.com/awk/index.htm&#34;&gt;Awk Tutorial&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;&#xA;&lt;hr&gt;&#xA;&lt;ol&gt;&#xA;&lt;li id=&#34;fn:1&#34;&gt;&#xA;&lt;p&gt;Una cosa che io trovo bellissima anche dal punto di vista diciamo così, &lt;em&gt;filosofico&lt;/em&gt;, e che mi ricorda i bellissimi articoli di Douglas Hofstadter su Le Scienze sui &lt;a href=&#34;http://www.repubblica.it/2003/g/rubriche/lessicoenuvole/9settemb/9settemb.html&#34;&gt;testi autoreferenziali&lt;/a&gt;.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;</description>
    </item>
  </channel>
</rss>
