L'outil POSIX pour les modifications scriptées d'un fichier (plutôt que d'imprimer le contenu modifié en sortie standard) est ex
.
printf '%s\n' 'g/^[^C]*C[^C]*$/d' x | ex file.txt
Bien sûr, vous pouvez l' utilisersed -i
si votre version de Sed le prend en charge, sachez que ce n'est pas portable si vous écrivez un script destiné à être exécuté sur différents types de systèmes.
David Foerster a demandé dans les commentaires:
Y a-t-il une raison pour laquelle vous utilisez printf
et non echo
ou quelque chose comme ça ex -c COMMAND
?
Réponse: oui.
Pour printf
vs echo
c'est une question de portabilité; voir Pourquoi printf est-il meilleur que l'écho? Et il est également plus facile de séparer les nouvelles lignes entre les commandes à l'aide de printf
.
Pour printf ... | ex
vs. ex -c ...
, c'est une question de gestion des erreurs. Pour cette commande spécifique, cela n'aurait pas d'importance, mais en général c'est le cas; par exemple, essayez de mettre
ex -c '%s/this pattern is not in the file/replacement text/g | x' filename
dans un script. Comparez avec ce qui suit:
printf '%s\n' '%s/no matching lines/replacement/g' x | ex file
Le premier se bloque et attend l'entrée; le second se fermera lorsque EOF sera reçu par la ex
commande, donc le script continuera. Il existe d'autres solutions de contournement, telles que s///e
, mais elles ne sont pas spécifiées par POSIX. Je préfère utiliser le formulaire portable, illustré ci-dessus.
Pour la g
commande, il doit y avoir une nouvelle ligne à la fin, et je préfère utiliser printf
pour encapsuler les commandes plutôt que d'incorporer une nouvelle ligne entre guillemets simples.
awk
séparateur de champ!