Substitution texte dans fichier texte 4Go

Le
Arol
Alors voila, j'ai un fichier texte de 4Go ou je veux remplacer une chaîne
par une autre.

Je tapote :
sed -n -i 's/chaine1/chaine2/g' gros_fichier.txt

et la je me trouve avec gros_fichier.txt qui fait 0 octet.

Je refais la même commande avec un fichier de 1ko et ça marche.
J'en conclus que sed a un problème avec les gros fichiers.
Question, comment résoudre le problème ?
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Fabien LE LEZ
Le #1888583
On 02 Jul 2007 08:16:49 GMT, Arol
Alors voila, j'ai un fichier texte de 4Go ou je veux remplacer une chaîne
par une autre.

Je tapote :
sed -n -i 's/chaine1/chaine2/g' gros_fichier.txt


mv gros_fichier.txt gros_fichier.tmp
sed ....
Arol
Le #1895808
Le Mon, 02 Jul 2007 10:24:06 +0200, Fabien LE LEZ a écrit:

Alors voila, j'ai un fichier texte de 4Go ou je veux remplacer une chaîne
par une autre.

Je tapote :
sed -n -i 's/chaine1/chaine2/g' gros_fichier.txt


mv gros_fichier.txt gros_fichier.tmp
sed ....

Moui, je suis obligé de passer par un fichier intermédiaire ?
Je croyais justement que sed pouvait le faire sans passer par un fichier
intermédiaire.
Du coup avec 4go, sed perd un peu son intérêt.


Fabien LE LEZ
Le #1895806
On 02 Jul 2007 08:25:43 GMT, Arol
mv gros_fichier.txt gros_fichier.tmp
sed ....

Moui, je suis obligé de passer par un fichier intermédiaire ?
Je croyais justement que sed pouvait le faire sans passer par un fichier
intermédiaire.


On peut éviter facilement d'utiliser un fichier intermédiaire si le
fichier tient entier en mémoire.

Travailler directement sur le fichier, c'est déjà plus rock'n'roll.
Si la substitution réduit la taille des chaînes, c'est encore
possible, puisqu'on peut copier les données "vers l'avant" (i.e. on
lit un bloc, on le convertit, puis on le réécrit, soit au même
endroit, soit un peut avant dans le fichier).
Dans le cas contraire, on va devoir copier des données à un endroit du
fichier qu'on n'a pas encore lu, ce qui va occuper pas mal de RAM.

Cela dit, si sed n'est pas capable de travailler directement sur le
fichier, il devrait afficher un message d'erreur au lieu de tronquer
le fichier. Il y a donc un bug.
Est-ce que la taille de ton fichier est exactement 4*1024*1024*1024
octets ?


Arol
Le #1895805
Le Mon, 02 Jul 2007 10:56:20 +0200, Fabien LE LEZ a écrit:

On peut éviter facilement d'utiliser un fichier intermédiaire si le
fichier tient entier en mémoire.


ça je l'ai vu avec le fichier de 1ko.

Travailler directement sur le fichier, c'est déjà plus rock'n'roll.
Si la substitution réduit la taille des chaînes, c'est encore
possible, puisqu'on peut copier les données "vers l'avant" (i.e. on
lit un bloc, on le convertit, puis on le réécrit, soit au même
endroit, soit un peut avant dans le fichier).


Justement non, la chaîne à remplacer est plus longue, ça écrasera
forcément.

Cela dit, si sed n'est pas capable de travailler directement sur le
fichier, il devrait afficher un message d'erreur au lieu de tronquer
le fichier. Il y a donc un bug.
Est-ce que la taille de ton fichier est exactement 4*1024*1024*1024
octets ?


La taille fait exactement 4 428 134 749 != 4 294 967 296

Mais bon, j'ai réussis la manip avec
sed 's/chaine1/chaine2/g' gros_fichier.txt > nouveau_gros_fichier.txt

Heureusement que j'ai un gros disque dur bien rapide.

Mihamina Rakotomandimby (R12y)
Le #1895803
Fabien LE LEZ wrote:

Alors voila, j'ai un fichier texte de 4Go ou je veux remplacer une chaîne
par une autre.
Je tapote :
sed -n -i 's/chaine1/chaine2/g' gros_fichier.txt
mv gros_fichier.txt gros_fichier.tmp

sed ....

Mon serveur de news a filtré le message initial (en fait c'est Arol qui est
filtrée), mais qu'est ce qui ne va pas avec l'option -i de sed? C'est ce
qu'il lui faut, pourtant.

--
"Beaucoup de gens achètent des choses dont ils n'ont pas besoin
avec de l'argent qu'il n'ont pas (crédits & emprunts)
pour impressionner des gens qu'ils n'aiment pas."
Inconnu


Luc.Habert.00__arjf
Le #1895801
Fabien LE LEZ :

mv gros_fichier.txt gros_fichier.tmp
sed ....

Euh, c'est peu ou prou ce que fait sed -i, donc ça ne devrait pas changer
grand chose.

Luc.Habert.00__arjf
Le #1895800
Arol :

Je tapote :
sed -n -i 's/chaine1/chaine2/g' gros_fichier.txt

et la je me trouve avec gros_fichier.txt qui fait 0 octet.


Bah strace le pour voir ce qui se passe.

Publicité
Poster une réponse
Anonyme