Pochi comandi Unix sono famosi come sed, grep e awk. Vengono spesso raggruppati insieme, forse perché hanno nomi strani e potenti strumenti per l'analisi del testo. Condividono anche alcune somiglianze sintattiche e logiche. E mentre sono tutti utili per l'analisi del testo, ognuno ha le sue specialità. Questo articolo esamina il sed
comando, che è un editor di flusso .
Ho già scritto di sed, così come del suo lontano parente ed. Per familiarizzare con sed, aiuta ad avere una certa familiarità con ed perché ti aiuta ad abituarti all'idea dei buffer. Questo articolo presuppone che tu abbia familiarità con le basi di sed, il che significa che hai almeno eseguito il classico s/foo/bar/
comando trova e sostituisci stile.
[Scarica il nostro cheat sheet gratuito di sed]
Installazione di sed
Più risorse Linux
- Comandi Linux cheat sheet
- Cheat sheet sui comandi avanzati di Linux
- Corso online gratuito:Panoramica tecnica RHEL
- Cheat sheet della rete Linux
- Cheat sheet di SELinux
- Cheat sheet dei comandi comuni di Linux
- Cosa sono i container Linux?
- I nostri ultimi articoli su Linux
Se stai usando Linux, BSD o macOS, hai già installato GNU o BSD sed. Si tratta di reimplementazioni uniche del sed
originale comando e, sebbene siano simili, ci sono differenze minori. Questo articolo è stato testato sulle versioni Linux e NetBSD, quindi puoi usare qualsiasi sed che trovi sul tuo computer in questo caso, anche se per BSD sed devi usare opzioni brevi (-n
invece di --quiet
, per esempio) solo.
GNU sed è generalmente considerato il sed più ricco di funzionalità disponibile, quindi potresti volerlo provare indipendentemente dal fatto che tu stia utilizzando o meno Linux. Se non riesci a trovare GNU sed (spesso chiamato gsed su sistemi non Linux) nel tuo albero dei port, puoi scaricare il suo codice sorgente dal sito web di GNU. La cosa bella dell'installazione di GNU sed è che puoi usare le sue funzioni extra ma anche costringerlo a conformarsi alle specifiche POSIX di sed, se dovessi richiedere la portabilità.
Gli utenti MacOS possono trovare GNU sed su MacPorts o Homebrew.
Su Windows, puoi installare GNU sed con Chocolatey.
Capire lo spazio del modello e lo spazio di attesa
Sed funziona esattamente su una riga alla volta. Poiché non ha una visualizzazione visiva, crea uno spazio modello , uno spazio in memoria contenente la riga corrente dal flusso di input (con qualsiasi carattere di nuova riga finale rimosso). Dopo aver popolato lo spazio del pattern, sed esegue le tue istruzioni. Quando raggiunge la fine dei comandi, sed stampa il contenuto dello spazio pattern nel flusso di output. Il flusso di output predefinito è stdout , ma l'output può essere reindirizzato a un file o anche di nuovo nello stesso file utilizzando il --in-place=.bak
opzione.
Quindi il ciclo ricomincia con la riga di input successiva.
Per fornire un po' di flessibilità mentre scorri i file con sed, sed fornisce anche uno spazio di attesa (a volte chiamato anche tampone di attesa ), uno spazio nella memoria di sed riservato alla memorizzazione temporanea dei dati. Puoi pensare a tenere lo spazio come un blocco per appunti, e in effetti, questo è esattamente ciò che dimostra questo articolo:come copiare/tagliare e incollare con sed.
Innanzitutto, crea un file di testo di esempio con questo testo come contenuto:
Line one
Line three
Line two
Copia dei dati per mantenere lo spazio
Per posizionare qualcosa nello spazio di attesa di sed, usa il h
o H
comando. Una h
minuscola dice a sed di sovrascrivere il contenuto corrente dello spazio di attesa, mentre una H
maiuscola gli dice di aggiungere dati a tutto ciò che è già nello spazio di attesa.
Usato da solo, non c'è molto da vedere:
$ sed --quiet -e '/three/ h' example.txt
$
Il --quiet
(-n
in breve) l'opzione sopprime tutto l'output ma ciò che sed ha eseguito per i miei requisiti di ricerca. In questo caso, sed seleziona qualsiasi riga contenente la stringa three
e copiandolo per mantenere lo spazio. Non ho detto a sed di stampare nulla, quindi non viene prodotto alcun output.
Copia dei dati dallo spazio di attesa
Per avere un'idea dello spazio di attesa, puoi copiarne il contenuto dallo spazio di attesa e inserirlo nello spazio del modello con il g
comando. Guarda cosa succede:
$ sed -n -e '/three/h' -e 'g;p' example.txt
Line three
Line three
La prima riga vuota viene stampata perché lo spazio di attesa è vuoto quando viene copiato per la prima volta nello spazio del modello.
Le due righe successive contengono Line three
perché è quello che c'è nello spazio di attesa dalla riga due in poi.
Questo comando utilizza due script univoci (-e
) puramente per aiutare con la leggibilità e l'organizzazione. Può essere utile dividere i passaggi in singoli script, ma tecnicamente questo comando funziona esattamente come un'istruzione di script:
$ sed -n -e '/three/h ; g ; p' example.txt
Line three
Line three
Aggiungere dati allo spazio pattern
Il G
il comando aggiunge un carattere di nuova riga e il contenuto dello spazio di attesa allo spazio del modello.
$ sed -n -e '/three/h' -e 'G;p' example.txt
Line one
Line three
Line three
Line two
Line three
Le prime due righe di questo output contengono entrambi i contenuti dello spazio pattern (Line one
) e lo spazio di attesa vuoto. Le due righe successive corrispondono al testo di ricerca (three
), quindi contiene sia lo spazio del modello che lo spazio di attesa. Lo spazio di attesa non cambia per la terza coppia di linee, quindi lo spazio del modello (Line two
) stampa con lo spazio di attesa (sempre Line three
) finale alla fine.
Fare taglia e incolla con sed
Ora che sai come destreggiarti tra una stringa da un pattern per mantenere lo spazio e tornare indietro, puoi ideare uno script sed che copia, quindi elimina e quindi incolla una riga all'interno di un documento. Ad esempio, il file di esempio per questo articolo ha Line three
fuori servizio. Sed può risolverlo:
$ sed -n -e '/three/ h' -e '/three/ d' \
-e '/two/ G;p' example.txt
Line one
Line two
Line three
- Il primo script trova una riga contenente la stringa
three
e lo copia dallo spazio del pattern allo spazio di attesa, sostituendo tutto ciò che si trova attualmente nello spazio di attesa. - Il secondo script elimina qualsiasi riga contenente la stringa
three
. Questo completa l'equivalente di un taglio azione in un elaboratore di testi o in un editor di testo. - Lo script finale trova una riga contenente
two
e aggiunge il contenuto di hold space in pattern space e quindi stampa lo spazio pattern.
Lavoro terminato.
Scripting con sed
Ancora una volta, l'uso di istruzioni di script separate è puramente per semplicità visiva e mentale. Il comando taglia e incolla funziona come un unico script:
$ sed -n -e '/three/ h ; /three/ d ; /two/ G ; p' example.txt
Line one
Line two
Line three
Può anche essere scritto come un file di script dedicato:
#!/usr/bin/sed -nf
/three/h
/three/d
/two/ G
p
Per eseguire lo script, contrassegnalo come eseguibile e provalo sul tuo file di esempio:
$ chmod +x myscript.sed
$ ./myscript.sed example.txt
Line one
Line two
Line three
Ovviamente, più è prevedibile il testo che devi analizzare, più facile sarà risolvere il tuo problema con sed. Di solito non è pratico inventare "ricette" per azioni sed (come un copia e incolla) perché la condizione per attivare l'azione è probabilmente diversa da file a file. Tuttavia, più diventi fluente con i comandi di sed, più facile sarà ideare azioni complesse basate sull'input che devi analizzare.
Le cose importanti sono riconoscere azioni distinte, capire quando sed si sposta alla riga successiva e prevedere cosa ci si può aspettare che lo schema e lo spazio di attesa contengano.
Scarica il cheat sheet
Sed è complesso. Ha solo una dozzina di comandi, ma la sua sintassi flessibile e la sua potenza pura significano che è pieno di potenziale infinito. Ero solito fare riferimento a pagine di battute intelligenti nel tentativo di ottenere il massimo da sed, ma è stato solo quando ho iniziato a inventare (e talvolta reinventare) le mie soluzioni che mi sono sentito come se stessi iniziando a effettivamente impara sed. Se stai cercando promemoria delicati dei comandi e suggerimenti utili sulla sintassi, scarica il nostro cheat sheet di sed e inizia a imparare sed una volta per tutte!