A ferramenta POSIX para edições com script de um arquivo (em vez de imprimir o conteúdo modificado para o padrão) é ex.
printf '%s\n' 'g/^[^C]*C[^C]*$/d' x | ex file.txt
Claro que você pode usarsed -i se a sua versão do Sed suportar, apenas lembre-se de que não é portátil se você estiver escrevendo um script destinado a ser executado em diferentes tipos de sistemas.
David Foerster perguntou nos comentários:
Existe uma razão pela qual você está usando printfe não echoou algo parecido ex -c COMMAND?
Resposta: Sim.
Para printfvs. echoé uma questão de portabilidade; consulte Por que printf é melhor que eco? E também é mais fácil intercalar novas linhas entre comandos usando printf.
Para printf ... | exvs. ex -c ..., é uma questão de tratamento de erros. Para este comando específico, isso não importaria, mas em geral importa; por exemplo, tente colocar
ex -c '%s/this pattern is not in the file/replacement text/g | x' filename
em um script. Contraste com o seguinte:
printf '%s\n' '%s/no matching lines/replacement/g' x | ex file
O primeiro travará e aguardará entrada; o segundo sairá quando o EOF for recebido pelo excomando, portanto, o script continuará. Existem soluções alternativas, como s///e, mas elas não são especificadas pelo POSIX. Eu prefiro usar o formulário portátil, que é mostrado acima.
Para o gcomando, deve haver uma nova linha no final, e eu prefiro usar printfpara agrupar os comandos do que incorporar uma nova linha entre aspas simples.
awkseparador de campo!