Cerca nel blog

2017/09/01

Come sostituire singole lettere maiuscole/minuscole in LibreOffice Writer usando le regex

Ultimo aggiornamento: 2017/09/01 14:10.

Per ragioni che sarebbe lunghissimo spiegare qui, ho per le mani una serie enorme di file di testo in formato OpenDocument (ODT) che devo elaborare per lavoro con LibreOffice. Una delle elaborazioni è la sostituzione in massa delle lettere che accompagnano i numeri di riferimento sparsi ovunque nei testi. Per esempio, nella frase "il cirbione vagolato 29A entra nell'interocitore 47C ed apre gli sconfiotti 17A, 14F, 19G e 1H" (non fate domande, vi prego; è solo un esempio), tutti i numeri di riferimento devono essere cambiati in modo che la loro lettera sia in minuscolo e quindi diventino 29a, 47c, 17a, 14f, 19g e 1h.

Farlo a mano sarebbe una forma di masochismo che vorrei evitare, anche perché file come questi mi arriveranno ancora per parecchio tempo, per cui mi serve un automatismo che faccia questa sostituzione.

LibreOffice ha una funzione di ricerca e sostituzione potente, che include anche le regular expressions (regex), ma non ho trovato online nulla che spieghi come creare (nel regex ristretto offerto da LibreOffice) un unico comando “cerca tutte le lettere singole precedute da almeno una cifra e volgile in minuscolo”: così ho chiesto alla saggezza della Rete di trovarmi la regex adatta al problema ed è venuta fuori questa soluzione ad opera di Carlo A. Furia, alias @bugcounting. La condivido qui perché magari torna utile a qualcuno:


In pratica, in LibreOffice cerco tutte le cifre seguite immediatamente da una lettera maiuscola ([0-9]+[A-Z]); l’opzione Find All me le seleziona tutte, e poi chiudo la finestra di ricerca e do il comando di volgere in minuscolo tutto quello che è stato selezionato (Cmd-0 sul Mac): ta-da! Grazie Carlo!

14 commenti:

Mauro ha detto...

Grazie dell'articolo.
Una puntualizzazione: il formato "Open Office" non esiste.
Esiste il formato Open Document Text contrassegnato dall'estensione ".odt"

Andrea ha detto...

se sei riuscito a partorire una frase tipo quella in corsivo devono essere dei file decisamente pesanti...:lol:

Diego Laurenti ha detto...

Ammazza che smanettoni! Io (non conoscendo Libre Office Writer) avrei tentato un approccio a-la "Winword" selezionando tutto il testo e dandogli di SHIFT+F3...ma in effetti è un approccio antiquato! :)

Paolo Attivissimo ha detto...

Mauro,

ovviamente hai ragione; ho corretto, grazie.

Pietrone ha detto...

Tu dici: "tutte le lettere singole precedute da almeno una cifra".
1) se veramente vuoi sostituire solo una lettere singola, allora in fondo alla regex dovresti aggiungere [^A-Za-z].
2) altrimenti, se vuoi rendere minuscola l'intera sequenza di lettere dopo una o più cifre, allora dovresti aggiungere un "+" in coda.

Se per esempio hai la stringa 123AB, nell'esempio da te riportato divrenterebbe 123aB, nel mio primo caso non verrebbe fatta nessuna sostituzione, nel secondo caso divreterebbe 123ab

Berto ha detto...

Ottimo! Può' essermi utile: scrivo saltuariamente manuali d'uso per lavoro e tengo tutto in odt.

Adesso scusate ma devo andare a cambiare la sabbia nella lettiera a del mio cerbionte vagolato.

Camicius ha detto...

L'alternativa (che peraltro eliminerebbe il lavoro manuale) potrebbe essere:

- esplodere il file odt che alla fine è uno zip
- usando un qualunque programma (per esempio sed) effettuare la sostituzione nel file content.xml. Da controllare che la regexp non "baci" con altre cose ma una cosa con dovrebbe essere sufficientemente sicura.
- ricomprimere il tutto in uno zip e rinominarlo.

Per un lavoro ho anche semplicemente estratto il content.xml e reinserito, ma ho avuto un po' di problemi a modificare il file dopo¹.

Questa cosa è automatizzabile via bash o python, e ha il vantaggio che fa le cose da solo (e più velocemente) che non apri-sostituisci-chiudi.






¹ sotto Linux
- unzip content.xml
- modifico il content.xml
- zip -u content.xml
Nel fare questo comando dà un errore, ma poi io facevo diventare tutto un pdf (con openoffice --headless --convert-to pdf )

daniele ha detto...

Ciao,

ti suggerisco di utilizzare il delimitatore di parole \b prima e dopo la regex:

[0-9]+[A-Z] -> \b[0-9]+[A-Z]\b

in modo da evitare di trovare quella chiave di ricerca all'interno di parole.

Massimo ha detto...

Comode le regex, oltre che divertentissime! Ogni volta che ne devo formulare una è un po' come fare la settimana enigmistica :D (ognuno si diverte come può)

andy ha detto...

[...] ma non ho trovato online nulla che spieghi come [...]

Io per le emergenze tengo da parte questo link:

Il sito di Claudio Romeo - Ricerche con le espressioni regolari in OpenOffice.org e in LibreOffice (web.archive.org)

(Non hai cercato offline. :D:D:D)

Ogni volta che ne devo formulare una è un po' come fare la settimana enigmistica :D

Quoto. :yes:

paolo ha detto...

Daniele, non conosco regex, ma ad occhio la tua espressione vuol dire "cerca qualcosa preceduto e seguito da spazio". In questo modo scarteresti tutto quello che è seguito da virgola, punto o altro delimitatore.

daniele ha detto...

@paolo:
no il delimitatore di parola \b serve proprio a limitare la parola \w, ovvero lettere e numeri, quindi la punteggiatura è esclusa.

newbrain ha detto...

xkcd obbligatorio:
https://xkcd.com/208/

MBonny ha detto...

Puoi anche salvare il documento in formato FODT che è un file di testo XML (sempre OpenDocument). A quel punto puoi usare qualsiasi programma. Ala fine lo riapri con LibreOffice e lo salvi di nuovo in OpenDocument compresso (ODT). Uso questo metodo per cambiare massivamente cose che da interfaccia devi fare a mano, ad es. sostituire tutti i riferimenti incrociati ad "Illustrazioni" con "Figure".