[ksh] Ecrire sans fichier temporaire

Ecrire sans fichier temporaire [ksh] - Shell/Batch - Programmation

Marsh Posté le 30-06-2009 à 15:10:55    

Bonjour,
 
 
Dans un script en ksh (sous Solaris) j'ai besoin d'écrire une ligne dans 2 fichiers, le premier tout à la fin et le second à l'avant dernière ligne (en conservant la dernière).
 
Pas de soucis pour faire ça avec sed, le problème est qu'il me créé un fichier temporaire que je dois renommer avec le nom du bon fichier et donc supprimer le bon fichier.
 
Problème : Je n'ai pas les droits pour rm et pour mv. Je peux juste écrire dans le fichier. Alors j'aimerais pouvoir le faire avec un simple appel Perl (-i), si quelqu'un pouvait m'aider pour la syntaxe à utiliser.
 
 
Merci.
 

Reply

Marsh Posté le 30-06-2009 à 15:10:55   

Reply

Marsh Posté le 30-06-2009 à 15:19:19    

avec sed, normalement tu as une technique pour réécrire dans le même fichier... je sais plus ce que c'est, je cherche.

Reply

Marsh Posté le 30-06-2009 à 15:23:38    

Code :
  1. man sed
  2. ...
  3.        -i[SUFFIX], --in-place[=SUFFIX]
  4.               edit files in place (makes backup if extension supplied)

par contre c gnu donc ca doit pas marcher sur tous les systèmes. Dsl si j'ai enfoncé une porte ouverte. :D


Message édité par pataluc le 30-06-2009 à 15:24:32
Reply

Marsh Posté le 30-06-2009 à 15:28:15    

J'ai oublié de préciser que le problème se pose surtout dans deux cas de figure :
 
- Avec le second fichier où je dois supprimer la dernière ligne, insérer la mienne, remettre la dernière.
 
- Et dans le cas où je dois supprimer ma ligne dans ces 2 fichiers, la suppression avec sed entraîne toujours la création d'un fichier temporaire.
 
Et je viens de regarder sous Solaris je n'ai pas l'option -i  :\


Message édité par Tonio94 le 30-06-2009 à 15:28:48
Reply

Marsh Posté le 13-07-2009 à 11:24:52    

Tonio94 a écrit :

Bonjour,
 
 
Dans un script en ksh (sous Solaris) j'ai besoin d'écrire une ligne dans 2 fichiers, le premier tout à la fin et le second à l'avant dernière ligne (en conservant la dernière).
 
Pas de soucis pour faire ça avec sed, le problème est qu'il me créé un fichier temporaire que je dois renommer avec le nom du bon fichier et donc supprimer le bon fichier.
 
Problème : Je n'ai pas les droits pour rm et pour mv. Je peux juste écrire dans le fichier. Alors j'aimerais pouvoir le faire avec un simple appel Perl (-i), si quelqu'un pouvait m'aider pour la syntaxe à utiliser.
 
 
Merci.
 


 
Intéressant. T'as le droit "w" sur le fichier mais pas sur le répertoire qui le contient.
 
Il y a une technique shell pour lire et écrire le même fichier sans passer par un fichier temporaire malheureusement elle nécessite d'avoir le droit d'effacement

Code :
  1. #!/bin/sh
  2. exec 3<fichier_a_traiter
  3. rm -f fichier_a_traiter
  4. while read line 0<&3
  5. do
  6.     # traitement de la ligne
  7.     ... $line .... $line ...
  8. done >fichier_a_traiter


 
Le rm -f est obligatoire car il permet de détacher logiquement le nom du fichier de ses data. Les data sont toujours dans le buffer 3 mais le nom ne leur sont plus associées. Et donc quand tu recrées le fichier via la redirection, le système lui attribue un nouvel ident et va y écrire les data.
Si tu ne fais pas de rm, alors le nom du fichier est toujours associé aux data et la redirection va les purger avant qu'elles ne soient lues et le buffer 3 ne contient alors plus rien.
D'où l'obligation impérative de pouvoir faire du rm.
 
Sinon désolé, je ne connais pas le perl...


Message édité par Sve@r le 13-07-2009 à 11:26:23

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

Sujets relatifs:

Leave a Replay

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