sed sta per Stream editor ed è un comando comunemente usato in Linux / Unix. Il nome deriva da una combinazione di queste due parole. Non è un editor di testo, sebbene modifichi il testo. Invece, sed riceve l’input di testo come “flusso” e modifica il flusso in base alle tue istruzioni.
In generale, le persone usano sed
come versione da riga di comando di trova e sostituisci. Il comando principale nel programma viene utilizzato per sostituire una stringa di caratteri con un’altra. Ciò lo rende utile per eseguire funzioni di ricerca e sostituzione su un batch di file, ma non è così facile da usare come qualcosa da Blocco note o Word. Scoprirai che la sintassi richiede un po ‘di tempo per abituarsi, ma una volta che l’hai abbassata, vedrai quanto può essere incredibilmente potente questo editor compatto.
Utilizzo di sed per la sostituzione
Per usare sed, dovrai aprire una finestra di Terminale. Il comando viene richiamato con sed
, ma digitarlo da solo non farà nulla. È necessario fornire uno dei comandi e alcuni parametri.
Il parametro più comune è sostituto, o s
. Un semplice sed
il comando di sostituzione ha un aspetto simile al seguente:
sed 's/cat/dog/'
Quel comando ordinerà a sed di scansionare il testo in arrivo e di sostituire ogni istanza della stringa “gatto” con “cane”. Per dimostrare, useremo il echo
comando per dare a sed qualcosa con cui lavorare.
echo cat catapult | sed 's/cat/dog/'
Ci sono tre parti principali del comando sed. Primo, c’è sed
che avvia il programma. Poi c’è il file s
che avvia il comando di sostituzione. Il taglio in avanti /
è un separatore. La stringa successiva sarà la stringa che sed cerca. La stringa dopo la seconda barra saranno i caratteri sostitutivi che sed scrive nel flusso. La barra finale chiude il comando. Tutti insieme, è 's/text-to-find/text-to-replace/'
.
Nota le virgolette singole in quell’esempio. Le virgolette singole ti consentono di utilizzare meta caratteri nel tuo comando. Sebbene le virgolette non siano essenziali per la maggior parte dei nostri esempi, dovresti sviluppare l’abitudine di utilizzare le virgolette per tutti i comandi.
E le stringhe parziali? Il comando precedente funzionerà su qualsiasi aspetto della stringa “gatto”, anche se fa parte di un’altra parola. Ad esempio, “catapulta” diventerà “dogapulta” mentre “catamarano” diventerà “dogamarano”.
echo catapult | sed 's/cat/dog/'
Sostituzione globale
Nel nostro primo esempio potresti aver notato che è stata sostituita solo la prima istanza della stringa corrispondente. Come molte utilità GNU, sed è basato sulla riga. Di conseguenza, funziona solo sulla prima corrispondenza all’interno di una riga. Se nella riga sono presenti più corrispondenze per la stringa candidata, verrà modificata solo la prima. Per far funzionare sed su ogni occorrenza della stringa di destinazione, utilizzare il g
flag alla fine del comando:
sed 's/cat/dog/g'
Questo funzionerebbe come il seguente esempio:
echo cat catapult catamaran | sed 's/cat/dog/g'
Senza il flag globale, verrebbe sostituita solo la prima istanza di “cat” in ogni riga.
Impostazione dei file di input e output
Per impostazione predefinita, sed opererà sullo standard input. Tuttavia, non è molto utile. Per eseguire sed su un file, specifica il nome del file alla fine del comando, in questo modo:
sed 's/cat/dog/g' oldfile.txt > newfile.txt
Questo eseguirà sed su “oldfile.txt” e salverà l’output del comando in “newfile.txt”. Se “newfile.txt” non esiste, verrà creato dal comando. Se non specifichi un file di output, sed eseguirà l’eco del nuovo testo del file nell’input standard.
Se vuoi sovrascrivere il contenuto di un file, dovrai usare l’estensione -i
bandiera. Questo flag rende le modifiche “in atto”.
sed -i '' 's/cat/dog' oldfile.txt
Questo comando sovrascrive immediatamente il contenuto del file di destinazione, il che è leggermente pericoloso. Per stare al sicuro, puoi creare un backup in loco.
Per creare un backup del file, inserisci un’estensione dopo il -i
. Non è necessario che sia un’estensione funzionale: “.bu” o “.bak” funzionano bene. Questo creerà un file di backup con un’estensione.
sed -i.bak 's/cat/dog' oldfile.txt
Viene creato “oldfile.txt.bak”, che contiene i dati di testo non modificati dalla versione originale di “oldfile.txt”.
Corrispondenza di espressioni regolari
Il vero potere di sed
proviene dalla corrispondenza di espressioni regolari. Ciò consente di impostare modelli per la corrispondenza, anziché stringhe letterali. Ad esempio, potremmo usare qualcosa come la stringa di seguito per ripetere qualsiasi insieme di uno o più numeri:
echo "123 abc" | sed 's/[0-9][0-9]*/& &/'
Apprendimento ulteriore
sed è un’utilità estremamente potente con una profondità di potenza simile a un linguaggio di scripting. Per saperne di più sulle funzionalità complete di sed, dai un’occhiata La guida completa di Bruce Barnett a sed.