Che cos'è sed ea cosa serve?


20

Ne ho viste molte di sedrecente e trovo che sia un comando piuttosto confuso. Le manpage non sono state particolarmente utili, ma so che può essere usato per analizzare l'output di altri comandi.

Cos'è esattamente sede quali sono gli usi? Sto cercando una risposta esauriente che copra ciò che sedè, ciò che comunemente viene utilizzato e alcuni esempi / sintassi di base.


3
Dalla pagina man di Sed:Sed is a stream editor. A stream editor is used to perform basic text transformations on an input stream (a file or input from a pipeline). While in some ways similar to an editor which permits scripted edits (such as ed), sed works by making only one pass over the input(s), and is consequently more efficient. But it is sed's ability to filter text in a pipeline which particularly distinguishes it from other types of editors.
saji89,

Questo dovrebbe essere un buon posto per iniziare una risposta completa: en.wikipedia.org/wiki/Sed
saji89

1
info sedha molto di più di man sed. Quindi, dentro /usr/share/doc/sed, c'è sedfaq.txt.gz.

Risposte:


20

Nell'uso di base viene utilizzato per "cercare e sostituire" con stringhe.

echo "The quick brown fox jumps over the lazy dog" | sed 's/dog/cat/'

ritorna

"The quick brown fox jumps over the lazy cat"

Sed brilla davvero quando vengono usate espressioni regolari.

Potresti dare un'occhiata a questo articolo su sed, è abbastanza completo.


5

definizioni

Unix System V: una guida pratica , libro di Mark Sobell:

L'utilità sed è un editor batch (non interattivo). I comandi sed sono di solito memorizzati in un file di script. . . sebbene tu possa dare semplici comandi sed dalla riga di comando. . .

Pagina man per sed (GNU sed) 4.2.2:

Sed è un editor di stream. Un editor di flussi viene utilizzato per eseguire trasformazioni di testo di base su un flusso di input (un file o input da una pipeline).

La mia definizione informale:

Sed(abbreviazione di stream editor ) è un'utilità di elaborazione del testo che è stata sviluppata nel momento in cui il testo è stato elaborato una riga alla volta, ma rimane una delle più potenti utility Unix / Linux; allo stesso tempo, è una forma di linguaggio di scripting, progettato specificamente per l'elaborazione del testo.

usi

Come suggerito dalle definizioni, sedviene utilizzato per l'elaborazione in batch di righe di testo, file di testo e flussi di testo convogliati. Più frequentemente viene utilizzato per la sostituzione e l'eliminazione del testo:

echo "stackexchange" | sed 's/stackexchange/askubuntu/'

Tuttavia, può anche essere utilizzato per imitare il comportamento di altri comandi. Ad esempio,

  • per imitare dmesg | head -n 3(stampando le prime 3 righe), possiamo fare dmesg | sed -n 1,3p.
  • per imitare dmesg | grep 'wlan0'(cercando una stringa), possiamo faredmesg | sed -n '/wlan0/p'
  • Voce di elenco

Il grande vantaggio che sedha rispetto ad altre utility di elaborazione del testo è la -ibandiera, il che significa che non possiamo solo inviare il testo modificato sullo schermo, ma in realtà salvare la modifica nel file originale. awki sapori, al contrario, hanno tale caratteristica solo nella GNU awkversione.

sedpuò accettare input dalla riga di comando, con più motivi separati da punto e virgola ( ;) o da un file di script specificato dopo il -fflag, ad escat someTextfile.txt | sed -f myScript.sed

Applicazioni ed esempi Sed



1

Questa risposta è un work in progress - manca altri esempi sul comando susbstitute


Che cosa è sed?

sed = Stream EDitor

La descrizione nella pagina di manuale per GNU sed4.2.2 riporta:

Sed è un editor di stream. Un editor di flussi viene utilizzato per eseguire trasformazioni di testo di base su un flusso di input (un file o input da una pipeline). Sebbene in qualche modo simile a un editor che consenta modifiche tramite script (come ed), sed funziona effettuando un solo passaggio sugli input e, di conseguenza, è più efficiente. Ma è la capacità di sed di filtrare il testo in una pipeline che lo distingue particolarmente dagli altri tipi di editor.

La descrizione nella pagina GNU sedsu gnu.org riporta:

sed (stream editor) non è un editor di testo interattivo. Al contrario, viene utilizzato per filtrare il testo, ovvero accetta input di testo, esegue alcune operazioni (o set di operazioni) su di esso e genera il testo modificato. sed viene in genere utilizzato per estrarre parte di un file utilizzando la corrispondenza del modello o sostituendo più occorrenze di una stringa all'interno di un file.

A cosa sedserve?

Può essere utilizzato per eseguire complesse modifiche ai flussi di dati (in genere testo, ma può essere utilizzato anche per modificare i dati binari).

Tra i casi più comuni di utilizzo ci sono:

  • Stampa / eliminazione selettiva di righe da un file di testo mediante espressioni regolari di base / estese
  • Sostituzione globale di stringhe in un file di testo utilizzando espressioni regolari di base / estese
  • Sostituzione selettiva di stringhe in un file di testo mediante espressioni regolari di base / estese

Questi sono i casi d'uso trattati in questa risposta.

uso

sedlegge l'input da un file archiviato nel filesystem se durante la sua chiamata viene specificato un nome file negli argomenti della riga di comando o stdinse non viene specificato alcun nome file.

Invocazione minima utilizzando un file archiviato nel filesystem:

sed '' file

Invocazione minima utilizzando stdin:

# herestring
<<<'Hello, World!' sed ''

# heredoc
<<'EOF' sed ''
heredoc> Hello, World!
heredoc> EOF

# file
<'file' sed ''

# pipe
echo 'Hello, World!' | sed ''

Ciao mondo!

sedper impostazione predefinita legge il file di input riga per riga; legge una riga, rimuove la nuova riga finale della riga e inserisce la riga elaborata in uno "spazio modello"; infine, esegue i comandi elencati sul contenuto corrente dello spazio modello e legge una nuova riga dal file di input.

Quando non viene specificato alcun comando o quando viene specificato pun dcomando o *, sedverrà sempre stampato il contenuto corrente dello spazio del modello seguito da una nuova riga a ogni iterazione, indipendentemente da:

user@debian ~ % sed '' file
Hello, world! # no command but the lines are printed
user@debian ~ % sed 'p' file
Hello, World!
Hello, World! # the p command prints the lines already printed
user@debian ~ % sed 'd' file
user@debian ~ % # the d command deletes the lines that would be printed

Per evitare questo si può invocare sedinsieme allo -nswitch:

user@debian ~ % sed -n '' file
user@debian ~ % sed -n 'p' file
Hello, World!
user@debian ~ % sed -n 'd' file
user@debian ~ % 

* Parlando solo per i comandi p, de s, che sono i comandi trattati in questa risposta.

Selezione di linee

sedpuò elaborare l'intero file di input o elaborare solo le righe selezionate del file di input; la selezione delle righe del file di input da elaborare viene effettuata specificando "indirizzi"; un indirizzo può essere (tra le altre cose) un numero di riga o un modello; gli intervalli di linee possono essere selezionati specificando intervalli di indirizzi.

Le possibili combinazioni di indirizzi sono:

  • <N>(dove <N>è un numero): i seguenti comandi / comandi verranno eseguiti solo sul numero di riga <N>;
  • <N>,<M>(dove <N>e <M>sono due numeri, <N>> <M>): i seguenti comandi / comandi verranno eseguiti su righe che vanno dal numero <N>di riga al numero di riga <M>incluso;
  • /<pattern>/(dove <pattern>è un'espressione regolare di base o estesa): i seguenti comandi / comandi verranno eseguiti solo su righe contenenti un occorrenza di <pattern>;
  • /<pattern1>/,/<pattern2>/(dove <pattern1>e <pattern2>sono essenziali o esteso espressioni regolari): il seguente comando / comandi verrà eseguito su linee che vanno dalla prima riga contenente un occorrenza di <pattern1>alla riga successiva contenente un'occorrenza di <pattern2>, più volte in caso di più ordinata <pattern1>- <pattern2>occorrenze;
  • <N>,/pattern/(dove <N>è un numero ed <pattern>è un'espressione regolare di base o estesa): i seguenti comandi / comandi verranno eseguiti su righe che vanno dal numero di riga <N>alla prima riga contenente un'occorrenza di <pattern>;
  • /pattern/,<N>(dove <pattern>è un'espressione regolare di base o estesa ed <N>è un numero): i seguenti comandi / comandi verranno eseguiti su righe che vanno dalla prima riga contenente un'occorrenza <pattern>al numero di riga <N>;

La selezione eseguita per stampare, eliminare o eseguire sostituzioni su intervalli di righe includerà sempre le righe corrispondenti agli indirizzi specificati; inoltre, la selezione effettuata per stampare, eliminare o eseguire sostituzioni su intervalli di linee usando i motivi è pigra e globale (vale a dire, ogni intervallo interessato sarà sempre il più piccolo possibile e saranno interessati più intervalli).

Quando si stampano intervalli di linee o si stampano solo linee su cui è stata eseguita una sostituzione, è necessario invocare sedinsieme -nall'interruttore per evitare che le linee corrispondenti al criterio vengano stampate due volte (ciò accade solo quando si stampano intervalli di linee) e in ordine per evitare che le righe non corrispondenti al criterio vengano stampate indipendentemente.

Una selezione di righe da elaborare deve essere seguita da un comando o da più comandi separati da punto e virgola raggruppati mediante parentesi graffe.

Comandi: stampa, cancella

I comandi utilizzati per stampare o eliminare una selezione sono, rispettivamente:

  • p: stampa le linee corrispondenti all'indirizzo / intervallo di indirizzi specificato;
  • d: elimina le righe corrispondenti all'indirizzo / intervallo di indirizzi specificati;

Quando uno di questi comandi non è preceduto da un indirizzo / selezione, il comando viene eseguito globalmente, cioè su ciascuna riga del file di input.

Esempi: stampa, cancella

Stampa / eliminazione di righe che specificano indirizzi numerici:

File di esempio:

line1
line2
line3
line4
line5
  • Linea di stampa <N>:
sed -n '<N>p' file
user@debian ~ % sed -n '3p' file
line3
  • Eliminazione riga <N>:
sed '<N>d' file
user@debian ~ % sed '3d' file
line1
line2
line4
line5
  • Stampa di linea <N>a <M>inclusiva:
sed -n '<N>,<M>p' file
user@debian ~ % sed -n '2,4p' file
line2
line3
line4
  • Eliminazione della riga <N>per <M>includere:
sed '<N>,<M>d' file
user@debian ~ % sed '2,4d' file
line1
line5

Stampa / eliminazione di righe che specificano motivi:

File di esempio:

First line
Start printing / deleting here
Random line
Random line
Random line
Stop printing / deleting here
Last line
  • Corrispondenza delle linee di stampa <pattern>:
sed -n '/<pattern>/p' file
user@debian ~ % sed -n '/print/p' file
Start printing / deleting here
Stop printing / deleting here
  • Eliminazione della corrispondenza delle righe <pattern>:
sed '/<pattern>/d' file
user@debian ~ % sed '/print/d' file 
First line
Random line
Random line
Random line
Last line
  • Stampa di linee dalla corrispondenza <pattern1>della riga alla corrispondenza della riga <pattern2>incluso:
sed -n '/<pattern1>/,/<pattern2>/p' file
user@debian ~ % sed -n '/Start/,/Stop/p' file
Start printing / deleting here
Random line
Random line
Random line
Stop printing / deleting here
  • Eliminazione di righe dalla corrispondenza <pattern1>della riga alla corrispondenza della riga <pattern2>incluso:
sed '/<pattern1>/,/<pattern2>/d' file
user@debian ~ % sed '/Start/,/Stop/d' file 
First line
Last line

Comando: sostituto

Il comando utilizzato per eseguire una sostituzione su una selezione è:

  • s: sostituisce le righe corrispondenti all'indirizzo / intervallo di indirizzi specificato;

Quando questo comando non è preceduto da un indirizzo / selezione, il comando viene eseguito globalmente, cioè su ciascuna riga del file di input.

La sintassi del scomando è:

s/<pattern>/<replacement_string>/<pattern_flags>

Le barre sono "delimitatori"; essi sono utilizzati per delimitare la <pattern>, <replacement_string>e <pattern_flags>sezioni;

Il delimitatore è sempre il personaggio immediatamente successivo al scomando; può essere impostato su qualsiasi altro carattere, ad esempio |:

s|<pattern>|<replacement_string>|<pattern_flags>

<pattern>è un'espressione regolare di base o estesa; <replacement_string>è una stringa fissa che può includere sedsequenze specifiche con un significato speciale; <pattern_flags>è un elenco di flag che modificano il comportamento di <pattern>.

sedSequenze specifiche più comuni con un significato speciale:

  • &: backreference sostituito con la stringa corrispondente a <pattern>;
  • \<N>(dove <N>è un numero): backreference sostituito con il <N>gruppo catturato in <pattern>;

Flag più comuni:

  • g: forza la <pattern>corrispondenza globale, ovvero più volte in ciascuna riga;
  • i: costringe a <pattern>far combaciare maiuscole e minuscole;
  • p: stampa le righe su cui è stata eseguita una sostituzione (utile quando si utilizza il richiamo dello -nswitch sedper stampare solo le righe su cui è stata eseguita una sostituzione);

Esempi: sostituto

File di esempio:

A-well-a everybody's heard about the bird
B-b-b-bird, bird, bird, b-bird's the word
A-well-a bird, bird, bird, the bird is the word
A-well-a bird, bird, bird, well the bird is the word
A-well-a bird, bird, bird, b-bird's the word
A-well-a bird, bird, bird, well the bird is the word
A-well-a bird, bird, b-bird's the word
A-well-a bird, bird, bird, b-bird's the word
A-well-a bird, bird, bird, well the bird is the word
A-well-a bird, bird, b-bird's the word
A-well-a don't you know about the bird?
Well, everybody knows that the bird is the word!
A-well-a bird, bird, b-bird's the word
A-well-a...
  • Sostituzione della prima occorrenza di <pattern>con <replacement_string>su ogni riga:
sed 's/<pattern>/<replacement_string>/' file
user@debian ~ % sed 's/bird/birds/' file
A-well-a everybody's heard about the birds
B-b-b-birds, bird, bird, b-bird's the word
A-well-a birds, bird, bird, the bird is the word
A-well-a birds, bird, bird, well the bird is the word
A-well-a birds, bird, bird, b-bird's the word
A-well-a birds, bird, bird, well the bird is the word
A-well-a birds, bird, b-bird's the word
A-well-a birds, bird, bird, b-bird's the word
A-well-a birds, bird, bird, well the bird is the word
A-well-a birds, bird, b-bird's the word
A-well-a don't you know about the birds?
Well, everybody knows that the birds is the word!
A-well-a birds, bird, b-bird's the word
  • Sostituendo tutte le occorrenze di <pattern>con <replacement_string>su ogni riga:
sed 's/<pattern>/<replacement_string>/g' file
user@debian ~ % sed 's/bird/birds/g' file
A-well-a everybody's heard about the birds
B-b-b-birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, the birds is the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a don't you know about the birds?
Well, everybody knows that the birds is the word!
A-well-a birds, birds, b-birds's the word
A-well-a...
  • Selezione solo delle righe che iniziano con <pattern1>e sostituzione di tutte le occorrenze di <pattern2>con <replacement_string>:
sed -n '/^<pattern1>/s/<pattern2>/<replacement_string>/pg' file
user@debian ~ % sed -n '/^A/s/bird/birds/pg' file
A-well-a everybody's heard about the birds
A-well-a birds, birds, birds, the birds is the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a don't you know about the birds?
A-well-a birds, birds, b-birds's the word
  • Selezionare solo le righe che terminano con <pattern1>e sostituire tutte le occorrenze di <pattern2>con <replacement_string>:
sed -n '/<pattern1>$/s/<pattern2>/<replacement_string>/pg' file
user@debian ~ % sed -n '/word$/s/bird/birds/pg' file
B-b-b-birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, the birds is the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, birds, b-birds's the word
A-well-a birds, birds, birds, well the birds is the word
A-well-a birds, birds, b-birds's the word
A-well-a birds, birds, b-birds's the word
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.