Lo strumento POSIX per le modifiche tramite script di un file (piuttosto che stampare il contenuto modificato su standard out) è ex
.
printf '%s\n' 'g/^[^C]*C[^C]*$/d' x | ex file.txt
Ovviamente puoi usarlosed -i
se la tua versione di Sed lo supporta, tieni presente che non è portatile se stai scrivendo uno script che dovrebbe essere eseguito su diversi tipi di sistemi.
David Foerster ha chiesto nei commenti:
C'è un motivo per cui stai usando printf
e non echo
o qualcosa del genere ex -c COMMAND
?
Risposta: Sì
Per printf
vs. echo
è una questione di portabilità; vedi Perché printf è meglio dell'eco? Ed è anche più facile intercettare nuove righe tra i comandi usando printf
.
Per printf ... | ex
vs. ex -c ...
, è una questione di gestione degli errori. Per questo comando specifico non avrebbe importanza, ma in generale lo fa; per esempio, prova a mettere
ex -c '%s/this pattern is not in the file/replacement text/g | x' filename
in una sceneggiatura. In contrasto con quanto segue:
printf '%s\n' '%s/no matching lines/replacement/g' x | ex file
Il primo si bloccherà e attenderà l'input; il secondo uscirà quando EOF viene ricevuto dal ex
comando, quindi lo script continuerà. Esistono soluzioni alternative, ad esempio s///e
, ma non sono specificate da POSIX. Preferisco usare il modulo portatile, che è mostrato sopra.
Per il g
comando, ci deve essere una nuova riga alla fine e preferisco usare printf
per avvolgere i comandi piuttosto che incorporare una nuova riga tra virgolette singole.
awk
separatore di campo!