Le bandiere funzionano insieme in modo opposto a quello che ti aspetti. La documentazione di /e
è, per la cronaca:
Questo comando consente di convogliare l'input da un comando di shell nello spazio pattern. Se è stata effettuata una sostituzione, il comando che si trova in pattern space viene eseguito e pattern space viene sostituito con il suo output. Una nuova riga finale viene soppressa; i risultati sono indefiniti se il comando da eseguire contiene un carattere null. Questa è un'estensione GNU sed.
È scritto in modo un po' tortuoso. Ciò significa che, dopo il completamento di un s///
comando per questa riga, se c'è stata una modifica, la (nuova) riga viene eseguita come comando e il suo output utilizzato in sostituzione di questa riga.
Quindi, per il tuo comando dato:
echo AAA | sed -r 's/A/echo B/ge'
prima sostituisce ogni A
con echo B
e quindi esegue il risultato come comando. Ha (grosso modo) lo stesso effetto di:
echo AAA | sed -r 's/A/echo B/g' | sh
GNU sed
non supporta direttamente la modalità che desideri, anche se puoi simularla con uno script più complesso se lo desideri. In alternativa, /e
di Perl modificatore al suo s
command ha il comportamento che stai cercando, ma con espressioni Perl.
Tu lo sei ottenere più sostituzioni, ma non si ottengono più esecuzioni. Il modello viene eseguito una volta effettuate tutte le sostituzioni.
Senza il e
flag il risultato di
echo AAA | sed -r 's/A/echo B/g'
è
echo Becho Becho B
Quindi questa è la riga di comando che viene eseguita se lo fai includi e
flag, che equivale a
echo 'Becho Becho B'
Per ottenere 'BBB' da 'AAA' usando il comando 's' di GNU sed con il flag 'e', si può fare questo:
echo AAA | sed -re 's/A/echo -n B;/ge'
'AAA' è sostituito da 'echo -n B;echo -n B; echo -n B;', che, una volta eseguito, porta a 3 comandi echo in esecuzione in sequenza, uno per ciascuna delle corrispondenze globali. La '-n' omette i caratteri di avanzamento riga dall'output di echo, facendo in modo che le 'B finiscano su una riga (ma sed aggiunge un avanzamento riga da solo quando finalmente stampa lo spazio pattern).