Je viens de courir
cat /opt/webapplications/Word/readme.log | grep -v 'Apple'
et j'ai obtenu la sortie sur le cli que j'attendais, qui était toutes les lignes readme.log
qui ne contenaient pas ' Apple
' ...
Ensuite, j'ai couru ...
cat /opt/webapplications/Word/readme.log | grep -v 'Apple' > /opt/webapplications/Word/readme.log
Cependant, /opt/webapplications/Word/readme.log
est vide.
Quelqu'un peut-il m'expliquer pourquoi cela s'est produit, ou la façon correcte dont j'aurais dû procéder?
Réponses:
Cela est arrivé parce que la première chose à
>
faire est de créer le fichier dans lequel il veut écrire - et si le fichier existe déjà, son contenu sera supprimé. (De plus, il n'est pas du tout nécessaire d'utilisercat
dans votre déclaration, car ilgrep
fonctionne sur des fichiers, pas seulement sur STDIN.)La bonne façon de procéder consiste à utiliser un fichier temporaire pour lire ou pour écrire. Donc soit
ou
travaillerait.
la source
Lors d'une redirection vers le même fichier (
>
), le shell peut créer / tronquer le fichier avant que lacat
commande ne soit invoquée et que l'entrée ne soit lue (voir: Pourquoi «trier fichier1> fichier1» ne fonctionne pas? ). Si vous souhaitez filtrer le fichier, il est préférable de rediriger la sortie vers un fichier différent, ou d'éviter la redirection du tout, par exemple:Le moyen le plus sûr et le plus sûr consiste à utiliser des éditeurs sur place conçus pour ce type d'opérations, par exemple
ou utiliser
ex
(partie de Vim):En relation:
la source