Non trovo alcuna documentazione sullo sed
-e
switch, 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
-e
switch, 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ù -e
opzioni per creare uno script composto da molte parti.
$ sed -e "s/foo/bar/" -e "/FOO/d"
Sostituirebbe prima foo
con bar
e 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/d
e raggruppati da {...
} eg /foo/{h;d}
ma per i i,a,c
comandi -e
fornisce 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 newline
frase 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 sed
te troverai che la -e
bandiera 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 -e
usato. Il motivo è che -e
consente 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 sed
interpreta il primo s/foo/bar
come un nome file. Quindi, per semplificarti la vita per il futuro, puoi già iniziare a usare la -e
bandiera 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
?