Qual è lo scopo di -e nel comando sed?


41

Non trovo alcuna documentazione sullo sed -eswitch, per una semplice sostituzione, ne ho bisogno?

per esempio

sed 's/foo/bar/'

VS

sed -e 's/foo/bar/'

14
Sei sicuro di non averlo trovato in man sed?

4
Non trovi la spiegazione dei potong, perché non usare "cmd1; cmd2"
utente sconosciuto

Risposte:


28

Dalla pagina man:

-e script, --expression=script

    add the script to the commands to be executed

Quindi puoi utilizzare più -eopzioni per creare uno script composto da molte parti.

$ sed -e "s/foo/bar/" -e "/FOO/d"

Sostituirebbe prima foocon bare quindi eliminerebbe ogni riga contenente FOO.


3
Quindi, non hai bisogno di '-e' se hai solo uno script, giusto?
JohnyTex,

Anch'io sto cercando il vero scopo di-e
typelogic

27

Questo potrebbe funzionare per te:

sed -e '/foo/i\' -e 'bar' -e '/fred/a\' -e 'barny' -e '/harry/c\' -e 'potter' file

In ogni caso, i comandi i(insert), a(append) e c(change) devono essere terminati da una nuova riga.

Normalmente i comandi possono essere separati da un ;eg /foo/d;/bar/de raggruppati da {...} eg /foo/{h;d}ma per i i,a,ccomandi -efornisce un modo per separare i comandi.

L'alternativa è usare la shell (bash) per inserire una nuova riga:

sed '/foo/i\bar'$'\n''/fred/a\barney'$'\n''/harry/c\potter' file

1
Su almeno alcune implementazioni di sed (ad esempio su FreeBSD), devi anche terminare le etichette e i comandi di diramazione usando newline / -e, piuttosto che con punti e virgola. Questo non funziona: sed ':a; /x/ { s/x/y/g; ba }; q' <<< "jxm". Ma questo:sed -e ':a' -e '/x/ { s/x/y/g; ba' -e '}; q' <<< "jxm"
dubiousjim,

Non sono sicuro di quanto sia necessaria la must be terminated with a newlinefrase qui. Quando ho provato qui nel mio cygwin, questo funziona: sed '/foo/i\bar' file. Quindi, ora che possiamo fondere le espressioni separate in una sola, questo si pone di nuovo alla domanda originale: qual è il vero scopo del -e?
dattiloscritto il

1

-e, equivalente a --expression, è facoltativo, a meno che non si stiano mettendo insieme più espressioni (non comuni) come mostrato in un'altra risposta .

A parte: ;può essere usato invece nella stessa espressione per eseguire diverse espressioni una dopo l'altra.


0

Nell'aiuto per sedte troverai che la -ebandiera sta per:

 -e script, --expression=script
                 add the script to the commands to be executed

Ma non sei il primo ad essere confuso dopo l'incontro -e. Nel tuo esempio sed 's/foo/bar/'e sed -e 's/foo/bar/'sono equivalenti. In entrambi i casi s/foo/bar/è la sceneggiatura eseguita da sed. La seconda opzione è più esplicita, ma probabilmente non è questo il motivo che vedi spesso -eusato. Il motivo è che -econsente di utilizzare più di uno script con la stessa invocazione di sed. Questo lascia ancora la domanda perché usarlo se stai usando solo uno script? L'esempio seguente potrebbe spiegare che:

echo "foo" | sed -e 's/foo/bar/' -e 's/bar/foo'

Emetterà "pippo".

Tuttavia,

echo "foo" | sed 's/foo/bar/' -e 's/bar/foo'

fallirà perché ora sedinterpreta il primo s/foo/barcome un nome file. Quindi, per semplificarti la vita per il futuro, puoi già iniziare a usare la -ebandiera oggi. In questo modo in futuro puoi semplicemente aggiungere il comando con uno script aggiuntivo usando -e <script>.

NB In altre risposte ;è stato suggerito l' utilizzo in alternativa all'uso di più script. Sebbene ciò sia tecnicamente possibile in alcuni casi, non è incoraggiato, perché porta rapidamente a codice molto difficile da leggere. Vedi un esempio qui: https://www.grymoire.com/Unix/Sed.html#uh-61

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.