inserer et supprimer des lignes dans un fichier

inserer et supprimer des lignes dans un fichier - Shell/Batch - Programmation

Marsh Posté le 13-08-2008 à 11:04:31    

Salut,
 
Pour inserer des lignes les une après les autres dans un fichier je fait ceci :

Citation :

echo "test" >> monfichier


 
Ex :

Citation :


test
test
test


 
Dans mon fichier j'ai trois lignes avec test, comment pourrai je faire pour supprimer une ligne ..??
 
Pour compter le nombre de ligne je fais ceci :

Citation :


[donny@perf script]$ wc -l pmaj_lock
      3 monfichier
 


 
comment pourrai je faire pour ne récupérer que le 3 ??
 
Merci de votre aide.

Reply

Marsh Posté le 13-08-2008 à 11:04:31   

Reply

Marsh Posté le 13-08-2008 à 11:33:04    

pour la suppression j'ai trouver ceci  
 
sed '$d' mon_fichier.txt  
 
mais le truc c'est que quand j'ouvre mon fichier j'ai toujours les 3 lignes

Reply

Marsh Posté le 13-08-2008 à 14:01:21    

J'ai pas très bien compris.
Tu cherche a supprimer une ligne dans un fichier.
 

Code :
  1. test
  2. test
  3. test


donnerait

Code :
  1. test
  2. test


 
?

Reply

Marsh Posté le 13-08-2008 à 14:47:16    

ouai c'est ça
je viens de tester avec cela
 sed -i.bak '$d' monfichier
 
et cela fonctionne;
le d'avoir ajouté le .bak, la ligne est bien supprimé du fichier
et je ne comprends pas trop comment cela fonctionne;

Reply

Marsh Posté le 14-08-2008 à 09:23:01    

donny3 a écrit :


et je ne comprends pas trop comment cela fonctionne;


Le principe général d'une commande Unix/Linux est la suivante
clavier => commande => écran
 
A partir de ce principe simplissime, et en utilisant les redirections entrées et sorties, on peut enchainer tout un ensemble de commandes à suivre. Chaque commande étant elle-même très simple mais l'enchainement créé donnera un traitement complexe pouvant s'appliquer aussi aux fichiers puisqu'il suffira d'utiliser la commande cat qui envoie un fichier à l'écran et en commençant la redirection à partir de cette commande
Cet enchainement aura la forme générale suivante
cat fichier_input |commande1 |commande2 |commande3 |commande4 |... |commandeX > fichier_output
 
Exemple

Code :
  1. cat monfichier |sed '$d' >result


C'est le principe de base.
 
Cependant certaines commandes plus complètes acceptent de recevoir elles-mêmes le fichier en paramètre. Elles s'occupent alors elles-mêmes de le lire. sed en fait partie. Donc l'exemple précédent peut se réduire en

Code :
  1. sed '$d' monfichier >result


ce qui évite un processus.
 
D'un autre coté, le mécanisme de sortie est invariant. La dernière commande de la chaine enverra son résultat à l'écran ce qui permettra dans un autre cas de l'imbriquer dans une autre chaine (comme un lego).
De plus, la redirection finale commence par écraser le fichier de sortie. Il s'ensuit que si on tente la syntaxe suivante
cat fichier |traitement >fichier
On perd tout puisque le shell commence par écraser le fichier. Ainsi, si on doit modifier son fichier input, il faut passer par 2 phases

Code :
  1. cat fichier |traitement >fichier_temporaire
  2. mv fichier_temporaire fichier


En faisant bien attention aux accès concurrents (que se passe-t-il pour "fichier_temporaire" si 2 utilisateurs lancent ce code en même temps => penser donc à utiliser un nom unique pour "fichier_temporaire" en faisant intervenir la variable "$$" dans son nom)
 
Cependant, certaines commandes très rares ont été créées pour s'occuper elles-mêmes de la phase "fichier_temporaire". Je connaissais "sort" avec l'option "-o" mais il semble que "sed" avec "-i" puisse aussi le faire.
C'est ce qui se passe quand tu fais "sed -i.bak '$d' monfichier".
 
Maintenant, si tu dois faire plusieurs modifs dans ton fichier, tu peux aussi passer par "vi" en automatisé. C'est un processus lourd mais 100% garanti.
Exemple

Code :
  1. vi monfichier <<_EOT_ >/dev/null
  2. :3
  3. dd
  4. :w!
  5. :q
  6. _EOT_


C'est pas forcément utile pour juste la suppression de la ligne 3 mais pour des modifs plus complexes, ça peut être intéressant...


Message édité par Sve@r le 14-08-2008 à 09:31:29

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 18-08-2008 à 10:22:33    

merci

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed