La herramienta POSIX para ediciones guionadas de un archivo (en lugar de imprimir los contenidos modificados a la salida estándar) es ex.
printf '%s\n' 'g/^[^C]*C[^C]*$/d' x | ex file.txt
Por supuesto, puede usarlosed -i si su versión de Sed lo admite, solo tenga en cuenta que no es portátil si está escribiendo un script destinado a ejecutarse en diferentes tipos de sistemas.
David Foerster preguntó en los comentarios:
¿Hay alguna razón por la que estás usando printfy no echoo algo así ex -c COMMAND?
Respuesta: sí.
Para printfvs. echoes una cuestión de portabilidad; ver ¿Por qué es printf mejor que echo? Y también es más fácil intercalar líneas nuevas entre comandos usando printf.
Para printf ... | exvs. ex -c ..., es una cuestión de manejo de errores. Para este comando específico no importaría, pero en general sí; por ejemplo, intenta poner
ex -c '%s/this pattern is not in the file/replacement text/g | x' filename
en un guion Contraste con lo siguiente:
printf '%s\n' '%s/no matching lines/replacement/g' x | ex file
El primero colgará y esperará entrada; el segundo saldrá cuando el excomando reciba EOF , por lo que el script continuará. Existen soluciones alternativas, como s///ePOSIX, pero no están especificadas. Prefiero usar el formulario portátil, que se muestra arriba.
Para el gcomando, debe haber una nueva línea al final, y prefiero usar printfpara ajustar los comandos en lugar de incrustar una nueva línea entre comillas simples.
awkseparador de campo!