Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Substitution texte dans fichier texte 4Go

7 réponses
Avatar
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 ?

7 réponses

Avatar
Fabien LE LEZ
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 .... < gros_fichier.tmp > gros_fichier.txt

Avatar
Arol
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 .... < gros_fichier.tmp > gros_fichier.txt


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.


Avatar
Fabien LE LEZ
On 02 Jul 2007 08:25:43 GMT, Arol :

mv gros_fichier.txt gros_fichier.tmp
sed .... < gros_fichier.tmp > gros_fichier.txt


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 ?


Avatar
Arol
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.

Avatar
Mihamina Rakotomandimby (R12y)
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 .... < gros_fichier.tmp > gros_fichier.txt


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


Avatar
Luc.Habert.00__arjf
Fabien LE LEZ :

mv gros_fichier.txt gros_fichier.tmp
sed .... < gros_fichier.tmp > gros_fichier.txt


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

Avatar
Luc.Habert.00__arjf
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.