Fork me on GitHub

Sed replace & Python regex search and replace

Durante la conversione di adamantio.net da phpnuke/wordpress a pelican ho avuto la necessità di correggere iterativamente tutta una serie di links e tags.

Quindi strumenti come sed ed awk sono stati estremamente utili allo scopo.

Con sed mi è stato possibile sostituire o rimuovere stringhe in tutti i files ove era necessario, seguendo la sintassi:

$ sed -i '[email protected]:category: [email protected]:category: [email protected]' content/Lex/*.rst
per cambiare le categorie,
$ sed -i '[email protected]<dc:creator></dc:creator>@<dc:creator>tombolinux</dc:creator>@g' xml/GoogleGuide.xml
per aggiungere l'autore in un file xml contenente articoli da importare in pelican,
$ sed -i '[email protected]<div>@@g' content/GoogleGuide/*.md
per rimuovere tags inutili, ed infine mi è stato possibile ridurre anche il numero di linee vuote nei miei files con:
$ sed -i '/./,/^$/!d' content/GoogleGuide/*.md
D'altro canto ho trovato più confortevole usare python per effettuare sostituzioni più complesse, pertanto ho preparato un piccolo script che accetta come imput un file di testo su cui effettuare la sostituzione:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys, os, getopt, re

def utilizzo():
    print ("Utilizzo:")
    print os.path.basename(sys.argv[0]), ("-h|--help              #per l'aiuto")
    print os.path.basename(sys.argv[0]), ("-i|--input <inputfile> #per sostituire le stringhe date")

def aiuto():
    print ("Piccolo programma per la sostituzione di stringhe nei files.")
    print ("Usa le regex per individuare il pattern da ricercare e lo")
    print ("sostituisce con la stringa data")
    print ("Valorizzare le variabili \"pattern\" e \"nuovo_testo\" per")
    print ("ottenere la sostituzione del testo nel file di input")
    sys.exit()

def main(argv):
    inputfile = ''
    try:
        opts, args = getopt.getopt(argv, 'hi:', ['help', 'input='])
        if not opts:
            print ("Non è stata fornita alcuna opzione!\n")
            utilizzo()
    except getopt.GetoptError, e:
        print e
        utilizzo()
        sys.exit()
    for opt, arg in opts:
        if opt in ("-h", "--help"):
            aiuto()
        elif opt in ("-i", "--input"):
            inputfile = arg
            print ("Input file is:"), inputfile
    try:
        f = open (inputfile, 'r')
        testo = f.read ()
        # sostituire fra le virgolette l'espressione regolare per il match
        pattern = re.compile ("<a .*html'")
        # inserire fra gli apici la stringa o espressione regolare da sostituire
        nuovo_testo = re.sub(pattern, '------', testo)
        try:
            f = open (inputfile, 'w')
            f.write (nuovo_testo)
        finally:
            f.close ()
            print 'Processing done'
    except IOError:
        pass

if __name__ == "__main__":
   main(sys.argv[1:])

Questo script va lanciato con la seguente sintassi:

$ nomescript.py -i /nome/del/mio/file.ext

Fra le risorse più utili per armeggiare fra le espressioni regolari, oltre a google, segnalo: https://www.pythonregex.com/ per python e https://gskinner.com/RegExr/ come editor generico.

Commenti !

blogroll

social