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/'
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/'
Risposte:
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.
-e
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
-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"
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?
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
man sed?