OVH Cloud OVH Cloud

help sed

4 réponses
Avatar
laurent[pas-spam]
Bonjour,

Je veux nettoyer un fichier un supprimant les lignes vides :
#sed /^$/d fichier > fichier
La commande fonctionne en sortie mais mon fichier est vide ?
Je ne comprends pas !?

lolo

4 réponses

Avatar
Nicolas George
"laurent[pas-spam]" wrote in message
<4163d0d1$0$739$:
Je veux nettoyer un fichier un supprimant les lignes vides :
#sed /^$/d fichier > fichier
La commande fonctionne en sortie mais mon fichier est vide ?
Je ne comprends pas !?


En protégeant le /^$/d de toute interprétation par le shell, avec une paire
de ' ', ça marcherait probablement mieux.

Avatar
Marc Boyer
In article <4163d0d1$0$739$, laurent[pas-spam] wrote:
Bonjour,

Je veux nettoyer un fichier un supprimant les lignes vides :
#sed /^$/d fichier > fichier
La commande fonctionne en sortie mais mon fichier est vide ?


% sed /^$/d fichier > fichier.new
% mv fichier fichier.old
% mv fichier.new fichier

Marc Boyer
--
La contractualisation de la recherche, c'est me donner de l'argent pour
faire ce que je ne sais pas faire, que je fais donc mal, pendant que ce
que je sais faire, je le fais sans moyens...

Avatar
David LE BOURGEOIS
Bonjour,


Bonjour.


Je veux nettoyer un fichier un supprimant les lignes vides :
#sed /^$/d fichier > fichier
La commande fonctionne en sortie mais mon fichier est vide ?
Je ne comprends pas !?


C'est normal : la redirection commence avant l'exécution de la commande.
Le fichier est écrasé avant d'être lu.

Il faut passer par un fichier temporaire :
sed '/^$/d' "fichier" > "fichier.$$" && mv "fichier.$$" "fichier"

Sinon, en Perl ça donne :
perl -i -ne 'print unless /^$/' fichier

--
David LE BOURGEOIS

Avatar
Stephane Chazelas
2004-10-06, 16:55(+02), David LE BOURGEOIS:
[...]
Il faut passer par un fichier temporaire :
sed '/^$/d' "fichier" > "fichier.$$" && mv "fichier.$$" "fichier"

Sinon, en Perl ça donne :
perl -i -ne 'print unless /^$/' fichier



Ou alors:

sed -i '/./!d' fichier

(avec une version recente du GNU sed)

ou alors:

{ rm fichier && sed '/./!d' > fichier } < fichier

Ces trois versions (avec perl) peuvent etre dangereuse dans le
sens ou en cas de pepin le fichier peut etre perdu. D'ou
l'interet d'utiliser un fichier temporaire:

perl -i.back
ou
sed -i.back

au lieu de -i tout court.

--
Stephane