31+ Esempi per il comando sed Linux nella manipolazione del testo

Nel post precedente, abbiamo parlato delle funzioni bash e di come usarle direttamente dalla linea di comando, e abbiamo visto altre cose interessanti. Oggi parleremo di un comodo strumento per la manipolazione delle stringhe chiamato sed o comando sed Linux.

Utilizziamo sed per lavorare con i file di testo come i file di log, i file di configurazione e altri file di testo.

In questo post, ci concentreremo sul comando sed Linux, che è usato per la manipolazione del testo, che è un passo essenziale nel nostro percorso di scripting bash.

Il sistema Linux fornisce alcuni strumenti per l’elaborazione del testo; uno di questi strumenti è sed.

Discuteremo i 31+ esempi con immagini per mostrare l’output di ogni esempio.

Tabella del contenuto

Capire il comando sed Linux

Il comando sed è un editor di testo non interattivo. Il comando sed per Linux modifica i dati in base alle regole che fornisci; puoi usarlo così:

$ sed options file

Non ti limiti a usare sed per manipolare i file; puoi applicarlo direttamente a STDIN in questo modo:

$ echo "Welcome to LikeGeeks page" | sed 's/page/website/'

comando sed Linux

Il comando s sostituisce il primo testo con il secondo modello di testo. In questo caso, abbiamo sostituito la stringa “website” con la parola “page”.

L’esempio precedente era un semplice esempio per dimostrare lo strumento. Possiamo usare il comando sed Linux anche per manipolare i file.

Creiamo un file di esempio :

sed manipola file

$ sed 's/test/another test/' ./myfile

I risultati vengono stampati sullo schermo istantaneamente; non è necessario attendere l’elaborazione del file fino alla fine.

Se il vostro file è abbastanza grande, vedrete il risultato prima che l’elaborazione sia terminata.

Il comando Sed Linux non aggiorna i vostri dati. Invia solo il testo modificato a STDOUT. Il file è ancora intatto. Se hai bisogno di sovrascrivere il contenuto esistente, puoi controllare il nostro post precedente, che parlava di reindirizzamenti.

Usare più comandi sed Linux nella linea di comando

Per eseguire più comandi sed, puoi usare l’opzione -e in questo modo:

$ sed -e 's/This/That/; s/test/another test/' ./myfile

sed più comandi

Devi separare i comandi sed con un punto e virgola senza spazi.

Inoltre, potete usare un singolo apice per separare i comandi come questo:

$ sed -e '> s/This/That/> s/test/another test/' myfile

sed comandi separati

Lo stesso risultato, niente di che.

Leggere i comandi da un file

Puoi salvare i tuoi comandi sed in un file e usarli specificando il file con l’opzione -f.

$ cat mycommandss/This/That/s/test/another test/

$ sed -f mycommands myfile

leggere i comandi da un file

Sostituzione di flags

Guarda attentamente il seguente esempio:

$ cat myfile
$ sed 's/test/another test/' myfile

sed substitute flag

Il risultato precedente mostra che abbiamo sostituito la prima occorrenza in ogni riga. Per sostituire tutte le occorrenze di un modello, usate uno dei seguenti flag di sostituzione.

Possiamo scrivere i flag in questo modo:

s/pattern/replacement/flags

Ci sono quattro tipi di sostituzioni:

  • g, sostituisce tutte le occorrenze.
  • un numero, il numero di occorrenza del nuovo testo che volete sostituire.
  • p, stampa il contenuto originale.
  • w file: significa scrivere i risultati in un file.

Puoi limitare la sostituzione specificando il numero di occorrenza che deve essere sostituito in questo modo:

$ sed 's/test/another test/2' myfile

sed number flag

Come puoi vedere, abbiamo sostituito solo la seconda occorrenza su ogni linea.

Il flag g significa globale, cioè una sostituzione globale per tutte le occorrenze:

$ sed 's/test/another test/g' myfile

sed global flag

Il flag p stampa ogni linea che contiene una corrispondenza di pattern, puoi usare l’opzione -n per stampare solo le linee modificate.

$ cat myfile
$ sed -n 's/test/another test/p' myfile

sed supress lines

La bandiera w salva l’output in un file specificato:

$ sed 's/test/another test/w output' myfile

send output to file

Abbiamo stampato l’output sullo schermo, ma abbiamo salvato le linee corrispondenti nel file di output.

Sostituire i caratteri

Supponiamo che tu voglia cercare la shell bash e sostituirla con la shell csh nel file /etc/passwd usando sed, beh, puoi farlo facilmente:

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

Oh! sembra terribile. Puoi usare il punto esclamativo (!) come delimitatore di stringa come questo:

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

Ora è più facile da leggere.

Limitare sed

Il comando sed elabora l’intero file. Tuttavia, è possibile limitare il comando sed per elaborare linee specifiche; ci sono due modi:

  • Un intervallo di linee.
  • Un pattern che corrisponde a una linea specifica.

Si può digitare un numero per limitarlo ad una linea specifica:

$ sed '2s/test/another test/' myfile

sed restricted

Abbiamo modificato solo la linea due.

Che ne dite di usare un intervallo di linee:

$ sed '2,3s/test/another test/' myfile

replace range of lines

Inoltre, possiamo iniziare da una linea alla fine del file:

$ sed '2,$s/test/another test/' myfile

sostituire fino alla fine

Oppure si può usare uno schema come questo:

$ sed '/likegeeks/s/bash/csh/' /etc/passwd

sed pattern match

Fantastico!

Puoi usare le espressioni regolari per scrivere questo pattern per essere più generico e utile.

Cancellare le linee

Per cancellare le linee usando sed, puoi usare la bandiera delete (d) è tua amica.

Il flag delete cancella il testo dal flusso, non il file originale.

$ sed '2d' myfile

sed delete line

Qui cancelliamo solo la seconda linea da myfile.

E se cancellassimo un intervallo di linee?

$ sed '2,3d' myfile

delete multiple line

Qui cancelliamo un intervallo di linee, la seconda e la terza.

Un altro tipo di intervallo:

$ sed '3,$d' myfile

cancelliamo fino alla fine

Qui cancelliamo dalla terza linea alla fine del file.

Tutti questi esempi non modificano mai il file originale.

$ sed '/test 1/d' myfile

delete pattern match

Qui usiamo un pattern per cancellare la linea se corrisponde alla prima linea.

Se avete bisogno di cancellare un intervallo di righe, potete usare due pattern di testo come questo:

$ sed '/second/,/fourth/d' myfile

delete range of lines

Abbiamo cancellato dalla seconda alla quarta riga.

Inserire e aggiungere testo

Puoi inserire o aggiungere righe di testo usando i seguenti flag:

  • Il flag (i).
  • Il flag (a).
$ echo "Another test" | sed 'i\First test '

sed insert text

Abbiamo aggiunto il testo prima della linea specificata.

$ echo "Another test" | sed 'a\First test '

sed append

Abbiamo aggiunto il testo dopo la linea specificata.

Facile, guarda il seguente esempio:

$ sed '2i\This is the inserted line.' myfile

sed insert line

E l’aggiunta funziona allo stesso modo, ma guarda la posizione del testo aggiunto:

$ sed '2a\This is the appended line.' myfile

sed append line

Abbiamo usato le stesse bandiere ma con una posizione di inserimento o di aggiunta.

Modificare le linee

Per modificare una linea specifica, puoi usare il flag (c) in questo modo:

$ sed '3c\This is a modified line.' myfile

sed modify line

Puoi usare un pattern di espressione regolare, e tutte le linee che corrispondono a quel pattern saranno modificate.

$ sed '/This is/c Line updated.' myfile

sed pattern match

Trasforma i caratteri

La bandiera di trasformazione (y) funziona su caratteri come questo:

$ sed 'y/123/567/' myfile

sed transform character

Abbiamo applicato la trasformazione a tutti i dati, e non possiamo limitarla ad una specifica occorrenza.

Stampa i numeri di linea

Puoi stampare il numero di linea usando il segno (=) in questo modo:

$ sed '=' myfile

sed numeri di linea

Tuttavia, usando -n combinato con il segno uguale, il comando sed visualizza il numero di linea che contiene la corrispondenza.

$ sed -n '/test/=' myfile

nascondere le linee

Leggere i dati da un file

Puoi usare il flag (r) per leggere i dati da un file.

$ cat newfile
$ sed '3r newfile' myfile

lettura dati da file

Abbiamo inserito il contenuto dopo la terza riga come previsto.

E questo sta usando un pattern di testo:

$ sed '/test/r newfile' myfile

read match pattern

Fico vero?

Esempi utili

Supponiamo di avere un file che contiene del testo con un segnaposto, e di avere un altro file che contiene i dati che riempiranno il segnaposto dell’altro file.

Utilizzeremo i flag (r) e (d) per fare il lavoro.

La parola DATA in quel file è un segnaposto per un contenuto reale che memorizzeremo in un altro file chiamato data.

La sostituiremo con il contenuto reale:

$ Sed '/DATA>/ {r newfiled}' myfile

repalce segnaposto

Fantastico! Come puoi vedere, abbiamo riempito la posizione segnaposto con i dati dell’altro file.

Questa è solo una piccola introduzione sul comando sed. Il comando sed Linux è un altro mondo a sé stante.

L’unico limite è la tua immaginazione.

Spero che tu trovi facile manipolare le stringhe usando il comando sed Linux.

Grazie.

Fondatore di LikeGeeks. Lavoro come amministratore di sistema Linux dal 2010. Sono responsabile della manutenzione, della sicurezza e della risoluzione dei problemi dei server Linux per diversi clienti in tutto il mondo. Amo scrivere script di shell e Python per automatizzare il mio lavoro.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *