GNU/Linux >> Linux Esercitazione >  >> Linux

i flag sed e e g non funzionano insieme

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).


Linux
  1. sed:comando non trovato

  2. Perché il comando sudo:bundle non è stato trovato?

  3. echo il carattere di nuova riga non funziona in bash

  4. Il comando data di Linux non funziona

  5. Perché il mio crontab non funziona e come posso risolverlo?

Comando di salvataggio delle larve. Grub non funziona in Ubuntu 13?

Il comando dell'uomo non funziona?

16 Esempi pratici e utili di Echo Command in Linux

Il comando traceroute non funziona su Ubuntu

Il comando Linux 'll' non funziona

Comando Conda che funziona nel prompt dei comandi ma non nello script bash