OVH Cloud OVH Cloud

Enlever des lignes d'un fichier

13 réponses
Avatar
amorit
bonjour,
je cherche en une commande =E0 enlever d'un fichier texte des lignes
correspondant =E0 un masque.
Lorsque j'utilise la commande suivante :
cat nom_du_fichier |grep -v texte_a_enlever
j'obtient =E0 l'=E9cran le r=E9sultat voulu, mais lorsque j'ajoute :
cat nom_du_fichier |grep -v texte_a_enlever >nom_du_fichier
cel=E0 le vide
Qqun aurait-il la solution ?
merci d'avance

3 réponses

1 2
Avatar
lhabert
Stéphan Peccini :

Si c'est celui de droite qui est créé en premier, la redirection vide le
fichier avant que la commande de gauche ne soit lancée ;


Tout dépend de ce qu'on entend par créé. Il y a plusieurs stratégies
possibles pour le shell. Par exemple :

- ouvrir le fichier en écriture avant de forker les deux process qui vont
execer les deux membres du pipe. Dans ce cas, effectivement, le fichier se
fait zoinxer à coup sur

- forker deux process A et B, et dans A ouvrir le fichier en écriture puis
execer grep, et, dans B, execer cat. Là, peu importe l'ordre dans lequel A
et B sont forkés, on n'a aucune garantie sur l'ordre dans lequel le exec cat
et le open(fichier,O_WRONLY|O_TRUNC) vont être exécutés.

Avatar
lhabert
Stéphan Peccini :

Peut on en tirer une conclusion ?


Non, puisque ce que je disais n'excluait absolument pas le comportement que
tu décris.

Avatar
Stéphan Peccini

Stéphan Peccini :

Si c'est celui de droite qui est créé en premier, la redirection vide le
fichier avant que la commande de gauche ne soit lancée ;


Tout dépend de ce qu'on entend par créé. Il y a plusieurs stratégies
possibles pour le shell. Par exemple :

- ouvrir le fichier en écriture avant de forker les deux process qui vont
execer les deux membres du pipe. Dans ce cas, effectivement, le fichier se
fait zoinxer à coup sur


C'est à cela à quoi je pensais ; le mot "créé" est inadapté ; c'est plutôt
"évalué" l'expression de droite, enfin bref je ne trouve pas les bons mots.
Car en plus, pour les processus, c'est l'inverse de ce que je dis que
j'obtiens sur un autre exemple :
[ Grenouille]$ sleep 100 | sleep 200
...
[ ~]$ ps -ef | grep sleep
spc 13677 5003 0 17:44 pts/3 00:00:00 sleep 100
spc 13678 5003 0 17:44 pts/3 00:00:00 sleep 200
spc 13690 5006 0 17:44 pts/4 00:00:00 grep sleep
[ ~]$

- forker deux process A et B, et dans A ouvrir le fichier en écriture puis
execer grep, et, dans B, execer cat. Là, peu importe l'ordre dans lequel A
et B sont forkés, on n'a aucune garantie sur l'ordre dans lequel le exec
cat et le open(fichier,O_WRONLY|O_TRUNC) vont être exécutés.


A chaque fois que j'ai fait cette manipulation, (cat /tmp/toto | grep titi
/tmp/toto), j'ai toujours récupéré un fichier vide. Mais bon, ce ne doit
pas être représentatif.


--
Stephan Peccini
PhotoNature : <URL:http://www.photonature.fr>


1 2