logo

Comando Sed in Linux/Unix con esempi

Il comando 'sed' di Linux sta per editor di flussi. Viene utilizzato per modificare flussi (file) utilizzando espressioni regolari. Ma questa modifica non è permanente. Rimane solo visualizzato, ma in realtà il contenuto del file rimane lo stesso.

Viene utilizzato principalmente per la sostituzione del testo; inoltre, può essere utilizzato per altre operazioni di manipolazione del testo come inserimento, eliminazione, ricerca e altro. Il comando sed ci consente di modificare i file senza aprirli. Il supporto delle espressioni regolari lo rende uno strumento di manipolazione del testo più potente.

Panoramica del comando sed

È un'utilità Unix che trasforma e analizza il testo con un linguaggio di programmazione compatto e semplice. È stato integrato dal 1973 al 1974 da Lee E. McMahon dei Bell Labs ed è presente oggi per quasi tutti i sistemi operativi. Il comando sed era basato sugli aspetti di scripting del precedente qed (editor rapido) e dell'editor interattivo ed. È stato il primo strumento per supportare le espressioni regolari e rimane attivo per l'elaborazione del testo, soprattutto con il comando di sostituzione. Famosi strumenti alternativi includono Perl e AWK for 'modifica del flusso' e manipolazione di stringhe di testo in chiaro.

Modalità operativa del comando sed

Il comando sed è un'utilità di elaborazione del testo orientata alla riga: riga per riga legge il testo da un file o flusso di input in un buffer interno noto come pattern space. Tutte le letture di riga iniziano un ciclo. Il comando sed utilizza una o più operazioni che sono state descritte da uno script sed nel pattern space. Gestisce un linguaggio di programmazione utilizzando circa 25 comandi che descrivono le operazioni sul testo.

Per tutte le righe di input, il comando sed normalmente restituisce il pattern space e avvia nuovamente il ciclo con la riga successiva dopo aver eseguito lo script. Altre tipologie di fine script sono disponibili dai comandi dello script e dalle opzioni di impostazione, ad esempio N per includere immediatamente la riga successiva nel pattern space, q per uscire, d per rimuovere il pattern space e così via. Quindi, uno script sed si riferisce al corpo di un ciclo che itera da una linea di flusso, in cui la variabile del ciclo e il ciclo stesso sono mantenuti e impliciti da sed.

  • Uno script sed può essere descritto sulla riga di comando o letto attraverso un file isolato. Nello script sed, i comandi possono assumere un indirizzo aggiuntivo nel contesto di espressioni regolari o numeri di riga. L'indirizzo decide quando il comando viene eseguito. Ad esempio, 2d eseguirà il comando d (o cancella) solo sulla seconda riga di input, mentre /^ /d rimuoverà ogni riga che inizia con uno spazio.
  • Lo spazio di attesa, un buffer speciale isolato, può essere utilizzato da alcuni comandi sed per contenere un testo accumulato tra i cicli. Il linguaggio di comando di sed ha solo due variabili (pattern space e hold space) e funzionalità di ramificazione simili a GOTO. Tuttavia, il linguaggio è Turing-completo. Sono disponibili script sed esoterici per diversi giochi come tetris, scacchi, arkanoid e sokoban.
  • Il ciclo principale viene eseguito per tutte le righe del flusso di input, controllando lo script sed su tutte le righe di input. Le righe dello script sed sono tutte una coppia modello-azione, che rappresenta quale modello per la corrispondenza e quale azione implementare, che può essere copiata come un'istruzione condizionale. Le azioni predefinite (stampa pattern space, copia riga nel pattern space), flussi di input e output e variabili di lavoro (hold space e pattern space) sono implicite; è possibile specificare programmi concisi di una riga a causa del ciclo principale.

Utilizzo del comando sed

    Comando di sostituzione
    L'esempio seguente rappresenta il comando e l'uso tipico del comando sed, ovvero la sostituzione. L'utilizzo era la vera motivazione per il comando sed:
    sed 's/regexp/replacement/g' nomeFileinput > NomeFileoutputAltri comandi di sed
    Sono possibili anche altre modalità per un'elaborazione semplice con circa 25 comandi sed. Ad esempio, di seguito viene utilizzata l'opzione d per filtrare le righe che includono solo spazi e la fine del carattere di riga:
    sed '/^ *$/d' inputFileName
    L'esempio precedente utilizza alcuni dei metacaratteri delle espressioni regolari seguenti:
    • L'accento circonflesso (^) corrisponde all'inizio della riga.
    • Il simbolo del dollaro ($) è lo stesso del completamento della riga.
    • L'asterisco (*) è uguale alla occorrenza del carattere precedente più o zero.
    • Il simbolo più (+) è uguale a una o più occorrenze di caratteri precedenti.
    • Il punto interrogativo (?) è uguale alla occorrenza del carattere precedente più o zero.
    • Il simbolo del punto (.) è esattamente uguale a un carattere.
    sed come filtro
    Spesso, il comando sed viene utilizzato come filtro all'interno di una pipeline sotto Unix:
    $generadati | sed 's/x/y/g'
    Il programma generateData genera dati e il comando sed apporta una piccola modifica sostituendo x al posto di y.Script sed basati su file
    Spesso è utile inserire molti comandi sed, un singolo comando per ogni riga, all'interno di un file di script e utilizzare il flag -f per eseguire i comandi dal file:
    sed -f subst.sed nomeFileinput > NomeFileoutput

Sintassi:

 sed [OPTION]... {script-only-if-no-other-script} [input-file]... 

Opzioni:

Di seguito sono riportate alcune opzioni della riga di comando del comando sed:

-n, --quiet, --silent: Ci consente con forza di stampare lo spazio del modello.

-e script, --espressione=script: Serve per aggiungere lo script ai comandi da eseguire.

-f file-script, --file=file-script: Viene utilizzato per aggiungere il contenuto del file di script ai comandi da eseguire.

--follow-link simbolici: viene utilizzato per seguire i collegamenti simbolici durante l'elaborazione sul posto.

-i[SUFFISSO], --in-place[=SUFFISSO]: viene utilizzato per modificare i file sul posto (crea un backup se viene fornita l'opzione SUFFIX).

-l N, --lunghezza-linea=N: Viene utilizzato per specificare la lunghezza di ritorno a capo desiderata per il comando 'l'.

--posix: viene utilizzato per disabilitare tutte le estensioni GNU.

-E, -r, --regexp-esteso: Ci consente di utilizzare le espressioni regolari estese nello script (per la portabilità utilizzare POSIX -E).

-s, --separate: viene utilizzato per considerare i file come separati anziché come singoli e continua il lungo flusso.

--sandbox: Viene utilizzato per operare in modalità sandbox.

sonu nigam

-u, --unbuffered: Viene utilizzato per caricare quantità minime di dati dai file di input e svuota più spesso i buffer di output.

-z, --null-data: Viene utilizzato per separare le righe con caratteri NUL.

--aiuto: viene utilizzato per visualizzare il manuale di aiuto.

--versione: Viene utilizzato per visualizzare le informazioni sulla versione.

Esempi di comando sed

Vediamo i seguenti esempi:

Applicazione alla directory STDIN

Il comando sed non si limita solo a manipolare i file; inoltre, possiamo applicarlo alla directory STDIN.

 echo class7 | sed 's/class/jtp/' echo class7 | sed 's/7/10/' cat msg.txt | sed 's/learn/study/' 

I comandi precedenti sostituiranno il primo testo con il secondo modello di testo. Considera l'output seguente:

Filtro SED di Linux

Dall'output sopra, in primo luogo, abbiamo eseguito il comando 'sed' su una stringa 'class7' dove 'class' viene modificato in 'jtp' e 7 in 10. Quindi abbiamo eseguito il comando 'sed' su un flusso 'msg.txt ' dove 'imparare' viene convertito in 'studiare'.

Sostituzione globale

Nell'esempio precedente, tutte le parole 'impara' non sono state modificate in 'studia'. Per modificare ogni parola, dobbiamo usare una sostituzione globale 'g'. Modificherà tutte le parole specificate in un file o in una stringa.

Sintassi:

 command | sed 's///g' 

Considera gli esempi seguenti:

 echo class7 class9 | sed 's/class/jtp/g' cat msg.txt | sed 's/learn/study/g' 

I comandi precedenti sostituiranno tutto il modello di testo specificato. Considera l'output seguente:

Filtro SED di Linux

Dall'output precedente, eseguendo il comando 'echo class7 class9 | sed 's/class/jtp/g'' tutta la 'class' viene convertita in 'jtp' e con il comando 'cat msg.txt | sed 's/learn/study/g'' tutto il 'learn' è stato convertito in 'study'.

Rimozione di una linea

L'opzione 'd' ci permetterà di rimuovere una riga completa da un file. Dobbiamo solo specificare una parola da quella riga con l'opzione 'd' e quella riga verrà eliminata. Tieni però presente che tutte le righe che contengono la stessa parola verranno eliminate. Verrà eseguito come:

 cat | sed '//d' 

Considera il comando seguente:

 cat msg.txt | sed '/jtp/d' 

Il comando precedente eliminerà le righe con la parola 'jtp'. Considera l'output seguente:

Filtro SED di Linux

Dall'output precedente, eseguendo il comando 'cat msg.txt | sed '/jtp/d'' tutte le righe contenenti la parola 'jtp' vengono cancellate.

Utilizzando il comando sed multiplo

L'opzione '-e' ci consente di eseguire più comandi sed contemporaneamente. Possiamo eseguire più di un'operazione sed eseguendo il comando come:

 sed -e ' ; ' 

Considera il comando seguente:

 sed -e 's/red/blue/; s/yellow/black/' exm.txt 

Il comando precedente applicherà tutte le operazioni specificate nel file 'exm.txt'. Considera l'output seguente:

Filtro SED di Linux

Come possiamo vedere dall'output precedente, tutte le parole 'rosse' vengono sostituite con 'blu' e tutte le parole 'gialle' vengono sostituite con 'nero'. Possiamo anche separare i comandi in questo modo:

 sed -e ' >s/red/blue/; >s/yellow/black/' exm.txt 

Il risultato sarà lo stesso del comando precedente.

Lettura di comandi da un file

Possiamo salvare i comandi sed in un file e applicarli immediatamente in qualsiasi file. Può essere fatto specificando l'opzione '-f' come segue:

 sed -f 

Dal comando precedente, '' è un file che ha un elenco di comandi sed. Considera il comando seguente:

 sed -f SedCommands exm.txt 

Il comando precedente applicherà tutti i comandi specificati nel file 'SedCommand' su 'exm.txt'. Considera l'output seguente:

Filtro SED di Linux

Dall'output precedente, abbiamo utilizzato i comandi applicati all'esempio precedente. Quindi, l'output è lo stesso dell'esempio precedente.

Sostituzione dei caratteri

Possiamo usare il punto esclamativo (!) come delimitatore di stringa. Ad esempio, vogliamo sostituire la shell bash e sostituirla con la shell csh in '/etc/passwd'. Per fare ciò, esegui il comando seguente:

 sed 's//bin/bash//bin/csh/' /etc/passwd 

Possiamo ottenere lo stesso risultato eseguendo il comando seguente:

 sed 's!/bin/bash!/bin/csh!' /etc/passwd 

Limitare il sed

L'uso di base del comando sed elabora l'intero file. Ma possiamo limitare il comando sed e specificare qualsiasi riga. Esistono due modi per limitare il comando sed:

  • Una gamma di linee.
  • Un modello che corrisponde a una linea specifica.

Possiamo fornire un numero per specificare una riga come segue:

 sed '3s/Red/Blue/' exm.txt 

Il comando precedente applicherà l'operazione specificata sulla terza riga. Considera l'output seguente:

Filtro SED di Linux

Dall'output precedente, viene modificata solo la riga tre.

Possiamo anche specificare un intervallo di linee. Per specificare un intervallo di righe, eseguire il comando come segue:

 sed '1,3s/Red/Blue/' exm.txt 

Il comando precedente aggiornerà il testo specificato nelle righe 1 e 3. Considera l'output seguente:

Filtro SED di Linux

Inserimento e aggiunta di testo

I flag 'i' e 'a' vengono utilizzati per inserire e aggiungere il testo su un file. Il flag 'i' aggiungerà il testo prima della stringa e il flag 'a' verrà utilizzato per aggiungere testo dopo la stringa. Considera il comando seguente:

 echo 'Another Demo' | sed 'iFirst Demo' 

Il comando precedente inserirà il testo prima del testo 'Another Demo'. Considera l'output seguente:

Filtro SED di Linux

Per aggiungere testo, eseguire il comando come segue:

 echo 'Another Demo' | sed 'aFirst Demo' 

Il comando precedente aggiungerà il testo. Considera l'output seguente:

Filtro SED di Linux

Modifica delle linee

Il flag 'c' viene utilizzato per modificare una riga specifica. Per modificare una riga, eseguire il comando come segue:

 sed '3cThis is a modified line.' exm.txt 

Il comando precedente aggiornerà la riga tre. Considera l'output seguente:

Filtro SED di Linux

Possiamo anche usare un'espressione regolare per aggiornare più di una riga con lo stesso modello. Considera il comando seguente:

 sed '/Apple is /c Line updated.' exm.txt 

Il comando precedente aggiornerà tutte le righe con la stringa 'Apple is'. Considera l'output seguente:

Filtro SED di Linux

Trasformazione dei personaggi

Il flag 'y' viene utilizzato per trasformare i personaggi. La trasformazione dei personaggi non può essere limitata a eventi specifici. Per trasformare i caratteri, esegui il comando come segue:

 sed 'y/abc/def/' exm.txt 

Il comando precedente trasformerà i caratteri 'a', 'b', 'c' in 'd', 'e', 'f'. considera l'output seguente:

Filtro SED di Linux

Stampa dei numeri di riga

Il segno '=' viene utilizzato per stampare il numero di riga. Per stampare il numero di riga, eseguire il comando come segue:

 sed '=' exm.txt 

Il comando precedente visualizzerà il numero di riga del contenuto del file. Considera l'output seguente:

Filtro SED di Linux

Il segno uguale con l'opzione '-n' specifica il numero di riga che contiene uno script corrispondente. Considera l'output seguente:

 sed -n '/mango/=' exm.txt 

Il comando precedente visualizzerà il numero di riga che contiene la parola 'mango'. Considera l'output seguente:

Filtro SED di Linux

Dall'output sopra, possiamo vedere che la riga numero 2 contiene la parola 'mango'.