Commando sed

Scopo

Un editor di flusso.

Sintassi

sed-n ] Script File ... ]

sed-n ] [  -e Script ] ... [  -f FileScript ] ... File ... ]

Descrizione

Il comando sed modifica le righe dal parametro File specificato in base ad uno script di modifica e le scrive nell'emissione standard. Il comando sed include numerose funzioni per la selezione di righe da modificare e apporta le modifiche solo alle righe selezionate.

Il comando sed utilizza due spazi di lavoro per mantenere le righe da modificare: lo spazio modelli, in cui viene mantenuta la riga selezionata e lo spazio di conservazione, in cui è possibile memorizzare temporaneamente una riga.

Uno script di modifica è formato da singoli sottocomandi, ciascuno su una diversa riga. Il formato generico dei sottocomandi sed è il seguente:

[intervallo-indirizzi] funzione[modificatori]

Il comando sed elabora ciascuna parametro File immesso leggendo una riga di immissione in uno spazio modelli, applicando tutti i sottocomandi sed nella sequenza di cui gli indirizzi selezionano tale riga, e scrive lo spazio modelli nell'emissione standard. Ripulisce quindi lo spazio modelli e ripete il processo per ciascuna riga specifica nel parametro File immesso. Alcuni dei sottocomandi sed utilizzano uno spazio di conservazione per salvare tutto o parte dello spazio modelli per i richiami successivi.

Quando un comando include un indirizzo (un numero di riga o un modello di ricerca), solo la riga o le righe indirizzate sono influenzate dal comando. In caso contrario, il comando si applica a tutte le righe.

Un indirizzo è un numero di riga decimale, un $ (simbolo del dollaro), che indirizza l'ultima riga di emissione o un indirizzo di contesto. Un indirizzo di contesto è un espressione regolare simile a quelle utilizzate nel comando ed tranne per le seguenti differenze:

Alcuni comandi denominati comandi indirizzati consentono di specificare una riga o un indirizzo di righe a cui dovrebbe essere applicato il comando. Le seguenti regole si applicano ai comandi indirizzati:

Indicatori

-e Script Utilizza la variabile Script come script di modifica. Se si sta utilizzando solo un indicatore -e e nessun indicatore -f, è possibile omettere l'indicatore -e.
-f FileScript Utilizza la variabile FileScript come origine dello script di modifica. La variabile FileScript è una serie preparata di comandi di modifica applicata al parametro File.
-n Sopprime tutte le informazioni scritte normalmente nell'emissione standard.
Nota:
E' possibile specificare più indicatori -e e -f. Tutti i sottocomandi vengono aggiunti allo script nell'ordine specificato, indipendentemente dalla loro origine.

Sottocomandi sed

Il comando sed contiene i seguenti sottocomandi di script sed. Il numero tra parentesi che precede un sottocomando indica il numero massimo di indirizzi consentiti per il sottocomando.

Note:
  1. La variabile Testo che accompagna i sottocomandi a\, c\ e i\ può continuare per più di una riga, se tutte le righe tranne l'ultima terminano con una \ (barra retroversa) per indicare il carattere di nuova riga. Le barre retroverse nel testo vengono considerate come tali nella stringa di sostituzione di un comando s e possono essere utilizzate per proteggere i tabulatori e gli spazi vuoti iniziali dall'analisi che viene eseguita su ciascuna riga di script. Le variabili RFile e WFile devono terminare la riga comandi e devono essere precedute esattamente da uno spazio vuoto. Ciascuna variabile WFile viene creata prima dell'inizio dell'elaborazione.
  2. Il comando sed può elaborare fino a 999 sottocomandi in un file di modello.
Sottocomando Descrizione
(1) a\  
Testo Ubica la variabile Testo nell'emissione prima della lettura della riga di immissione successiva.
(2)b[etichetta] Si dirama nel comando : attinente alla variabile etichetta. Se la variabile etichetta è vuota, si dirama fino al termine dello script.
(2)c\  
Testo Elimina uno spazio modelli. Con l'indirizzo 0 o 1 oppure alla fine di un intervallo di indirizzo 2, ubica la variabile Testo nell'emissione ed avvia il ciclo successivo.
(2)d Elimina lo spazio modelli e avvia quindi il ciclo successivo.
(2)D Elimina il segmento iniziale dello spazio modelli nel primo carattere di nuova riga ed avvia quindi il ciclo successivo.
(2)g Sostituisce il contenuto dello spazio modelli con quello dello spazio di conservazione.
(2)G Accoda il contenuto dello spazio di conservazione allo spazio modelli.
(2)h Sostituisce il contenuto dello spazio di conservazione con quello dello spazio modelli.
(2)H Accoda il contenuto dello spazio modelli allo spazio di conservazione.
(1)i\  
Testo Scrive la variabile Testo nell'emissione standard prima di leggere la riga successiva nello spazio modelli.
(2)l Scrive lo spazio modelli nell'emissione standard visualizzando i caratteri non visualizzabili come valori esadecimali a 4 cifre. Le righe lunghe vengono divise.
(2)l Scrive lo spazio modelli nell'emissione standard in un formato visualmente non ambiguo. I caratteri \\\, \\a, \\b, \\f, \\r, \\t, e \\v vengono scritti come la sequenza di escape corrispondente. I caratteri non stampabili vengono scritti come un numero ottale a tre cifre (con un carattere di barra retroversa all'inizio) per ciascun byte nel carattere (con il byte più significativo per primo). Questo formato viene utilizzato anche per i caratteri a più byte. Questo sottocomando divide le righe lunghe. Una barra retroversa seguita da un carattere di nuova riga indica il punto della suddivisione. La suddivisione si verifica alla posizione di colonna 72. Un simbolo $ (dollaro) contrassegna la fine di ciascuna riga.
(2)n Scrive lo spazio modelli nell'emissione standard se l'emissione predefinita non viene eliminata. Sostituisce lo spazio modelli con la successiva riga di testo di immissione.
(2)N Accoda la riga successiva di immissione allo spazio modelli con un carattere di nuova riga integrato (il numero di riga corrente cambia). E' possibile utilizzarlo per ricercare i modelli che sono suddivisi in due righe.
(2)p Scrive lo spazio modelli nell'emissione standard.
(2)P Scrive il segmento iniziale dello spazio modelli nel primo carattere di nuova riga nell'emissione standard.
(1)q Si diffonde fino allo fine dello script. Non avvia un nuovo ciclo.
(2)r RFile Legge il contenuto della variabile RFile. Ubica il contenuto nell'emissione prima di leggere la riga di immissione successiva.
(2)s/modello/sostituzione/indicatori Sostituisce la stringa sostituzione per la prima ricorrenza del parametro modello nello spazio modelli. Un carattere visualizzato dopo il sottocomando s può sostituire il separatore / (barra) tranne per il carattere di spazio o di nuova riga.

Il valore della variabile indicatori deve essere uguale a zero o superiore a:

g
Sostituisce tutte le istanze non sovrapposte del parametro modello invece di sostituire solo la prima.
n
Sostituisce la ricorrenza n solo del parametro modello.
p
Scrive lo spazio modelli nell'emissione standard se era stata eseguita una sostituzione.
w WFile
Scrive lo spazio modelli nella variabile WFile se era stata eseguita una sostituzione. Accoda lo spazio modelli alla variabile WFile. Se non era già stata creata la variabile WFile da una scrittura precedente mediante lo script sed, viene creata dal comando sed.
(2)tetichetta Dirama la variabile :etichetta nel file di script se erano state eseguite sostituzioni dall'ultima lettura di un'esecuzione riga di immissione di un sottocomando t. Se non si specifica la variabile etichetta, il controllo si trasferisce alla fine dello script.
(2)wWFile Accoda lo spazio modelli alla variabile WFile.
(2)x Scambia i contenuti dello spazio modelli e dello spazio di conservazione.
(2)y/modello1/modello2/ Sostituisce tutte le ricorrenze dei caratteri nella variabile modello1 con i caratteri corrispondenti della variabile modello2. Il numero di caratteri nelle variabili modello1 e modello2 deve essere lo stesso. Il carattere di nuova riga è rappresentato da \n.
(2)!sed-cmd Applica il sottocomando sed specificato solo alle righe non selezionate in base agli indirizzi.
(0):etichetta Contrassegna un punto di diramazione per essere riferito dai sottocomandi b e t. Questa etichetta può essere una qualsiasi sequenza di otto o meno byte.
(1)= Scrive il numero di riga corrente nell'emissione standard come una riga.
(2){subcmd } Raggruppa i sottocomandi racchiusi tra {} (parentesi).
(0) Ignora un comando vuoto.
(0)# Se viene visualizzato un simbolo # (cancelletto) come primo carattere in una riga di un file di script, tutta la riga viene considerata come commento, con una eccezione. Solo per la prima riga di un file di script, se il carattere dopo il simbolo # è n, viene eliminata l'emissione predefinita. Il resto della riga dopo @n viene ignorato.

Stato di uscita

Questo comando restituisce i seguenti valori di uscita:

0 Completamento con esito positivo.
>0 Si è verificato un errore.

Esempi

  1. Per eseguire una modifica globale, immettere:

    sed  "s/happy/enchanted/g" chap1

    Questa sequenza di comandi sostituisce ciascuna ricorrenza della parola happy rilevata nel file chap1 con la parola enchanted. Il carattere g alla fine del sottocomando s indica al comando sed di eseguire tutte le sostituzioni possibili in ciascuna riga. Senza il carattere g, il comando sed sostituisce solo la prima ricorrenza della parola happy in una riga.

    Il comando sed funziona come un filtro. Legge il testo dall'immissione standard o dai file specificati nella riga comandi (chap1 in questo esempio), modifica il testo e lo scrive nell'emissione standard. Contrariamente alla maggior parte degli editor, non sostituisce il file originale. Questo rende il comando sed un comando potente se utilizzato nelle pipeline.

  2. Per utilizzare il comando sed come filtro in una pipeline, immettere:

    pr  chap2 | sed "s/Page *[0-9]*$/(&)/" | enq

    Questa sequenza di comandi racchiude i numeri di pagina tra parentesi prima di stampare il file chap2. Il comando pr inserisce un'intestazione e numero di pagina nella parte superiore di ciascuna pagina, quindi il comando sed inserisce i numeri di pagina tra le parentesi e il comando enq stampa l'elenco modificato.

    Il modello di comando sed /Page *[0-9]*$/ mette in corrispondenza i numeri di pagina che sono visualizzati a fine riga. Il sottocomando s lo modifica in (&), in cui & specifica il numero di pagina messo in corrispondenza.

  3. Per visualizzare le righe selezionate di un file, immettere:

    sed  -n  "/food/p" chap3

    Il comando sed -n visualizza ciascuna riga nel file chap3 che contiene la parola food. Normalmente, il comando sed copia ciascuna riga nell'emissione standard dopo la modifica. L'indicatore -n impedisce che il comando sed esegua tale operazione. Si utilizzano quindi i sottocomandi come p per scrivere parti specifiche di testo. Senza l'indicatore -n, questo esempio visualizzerebbe tutte le righe nel file chap3 e mostrerebbe ciascuna riga che contenente food due volte.

  4. Per eseguire la modifica complessa, immettere:

    sed  -f  script.sed  chap4

    Questa sequenza di comandi crea un file di script sed quando si desidera eseguire operazioni complesse. E' quindi possibile provare e modificare lo script prima di utilizzarlo. E' possibile utilizzare di nuovo lo script per modificare altri file. Creare il file di script con un editor di testo interattivo.

  5. Di seguito è riportato un esempio di file di script sed:

    :join
    /\\$/{N
    s/\\\n//
    b join
    }

    Questo script sed unisce ciascuna riga che termina con una \ (barra retroversa) alla riga seguente. Per prima cosa, il modello  /\\$/ seleziona una riga che termina con una \ per il gruppo di comandi racchiuso tra {} (parentesi graffe). Il sottocomando N accoda quindi la riga successiva, integrando il carattere di nuova riga. s/\\\n// elimina la \ e il carattere di nuova riga integrato. Infine, b join ritorna all'etichetta :join per controllare una alla fine della nuova riga unita. Senza la diramazione di ritorno, il comando sed scriverebbe la riga unita e leggerebbe quella successiva prima di controllare la presenza di una seconda  \.

    Nota:
    il sottocomando N arresta il comando sed immediatamente se non vi sono ulteriori righe di immissione (cioè se il sottocomando N rileva un carattere eof (fine file)). Non copia lo spazio modelli nell'emissione standard prima dell'arresto. Questo significa che se l'ultima riga dell'immissione termina con una \, non viene copiata nell'emissione.
  6. Per copiare un file esistente (oldfile) in un nuovo file (newfile) e sostituire tutte le ricorrenze della stringa di testo testpattern con il contenuto della variabile di shell $REPL, immettere:

    cat oldfile | sed -e "s/testpattern/$REPL/g" | tee newfile
  7. Per sostituire tutte le ricorrenze di A con a, B con b e C con c e tutte le ricorrenze di nuove righe con il carattere Z nel file di immissione, immettere:
    $ sed -f command.file input.file
    in cui command.file è il file di script e input.file è il file di immissione.
       $cat command.file
       y/ABC\n/abcZ/
    
    In alternativa, è possibile eseguire anche il seguente comando per la stessa funzione:
    sed "y/ABC\n/abcZ/" input.file

Informazioni correlate

Il comando awk e il comando grep.


Invia feedback |  Valuta questa pagina