inserer et supprimer des lignes dans un fichier - Shell/Batch - Programmation
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
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 :
|
donnerait
Code :
|
?
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;
Marsh Posté le 14-08-2008 à 09:23:01
donny3 a écrit : |
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 :
|
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 :
|
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 :
|
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 :
|
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...
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 :
echo "test" >> monfichier
Ex :
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 :
[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.