Contenu | Rechercher | Menus

Annonce

Bientôt Ubuntu 16.04 LTS
Réservez vos DVD et clé USB Ubuntu-fr dès maintenant

En cas de déconnexions intempestives, merci de vous connecter à partir de cette page en cochant la case « Me connecter automatiquement lors de mes prochaines visites ».

#1 Le 23/03/2010, à 09:21

DiouxX
Membre

[RESOLU] Sed : supprime ligne ne commencant pas par *:

Bonjour à tous,

Mon problème est le suivant, je dois réaliser un script en bash permettant de supprimer toutes les lignes ne commancant pas par *: ( * étant un nombre d'occurrence indéterminé).

Voici un exemple de fichier, ce sera plus parlant:

a: ligne à ne pas supprimer
ligne à supprimer 1
bcd: ligne à ne pas supprimer
ligne à supprimer 2
ligne à supprimer 3

Donc le but serait que le fichier final se présente comme ceci :

a: ligne à ne pas supprimer
bcd: ligne à ne pas supprimer

Tous les lignes ne commençant pas par les caractères *: sont supprimer.

Je sais utiliser la commande sled pour supprimer les lignes commençant par un mot mais pas l'inverse.

Merci d'avance.

Dernière modification par DiouxX (Le 23/03/2010, à 10:24)


La confiance excessive ameublit le sol sous les pieds de la victoire.

Hors ligne

#2 Le 23/03/2010, à 09:38

credenhill
Membre

Re : [RESOLU] Sed : supprime ligne ne commencant pas par *:

hello

$ cat a1
a: ligne à ne pas supprimer
ligne à supprimer 1
bcd: ligne à ne pas supprimer
ligne à supprimer 2
ligne à supprimer 3
$ 
$ sed -n '/^.*:/p' a1
a: ligne à ne pas supprimer
bcd: ligne à ne pas supprimer
$

Hors ligne

#3 Le 23/03/2010, à 09:45

Totor
Membre

Re : [RESOLU] Sed : supprime ligne ne commencant pas par *:

Bonjour,

sed '/^[^:]*:.*/!d' fichier

-- Lucid Lynx --

Hors ligne

#4 Le 23/03/2010, à 10:24

DiouxX
Membre

Re : [RESOLU] Sed : supprime ligne ne commencant pas par *:

J'ai oublier de préciser également que je devais supprimer des lignes qui commencait par un/des espaces mais pour ce la j'ai trouver la solution.

Je tiens à vous remercier pour votre aide et je vous met le script que j'ai créer afin de faire cela car les fichier que je dois traiter ont des tailles de plus de 700Mo et qu'il n' y a pas d'éditeur permettant d'éditer des fichiers de telle taille.

#!/bin/bash
#The script takes as argument the name of the file and the line to remove
#$1 : file name
#$2 : the line to remove (ex aci: )

case $# in
	'2')
	    #remove lines starting with $2
	    sed "/$2/d" $1>tmp
	    mv tmp $1
	    
	    #remove lines starting with space and starting not with ".:"
	    sed 's/^[ \t]*//' $1 | sed -e '/.: /!d' $1>tmp
	    mv tmp $1
	    ;;
	*)
	    echo -e "The script takes as argument the name of the file and the line to remove\n\$1 : file name\n\$2 : the line to remove"
	    ;;
esac

La confiance excessive ameublit le sol sous les pieds de la victoire.

Hors ligne

#5 Le 23/03/2010, à 18:59

sputnick
Membre

Re : [RESOLU] Sed : supprime ligne ne commencant pas par *:

DiouxX a écrit :

... les fichier que je dois traiter ont des tailles de plus de 700Mo et qu'il n' y a pas d'éditeur permettant d'éditer des fichiers de telle taille.

C'est inexact :

vim -c ':syntax off' <FICHIER TROP LOURD MEME QUE EMACS PLANTE QUAND IL ESSAYE DE LE LIRE>

Apres faut avoir les ressources en RAM/swap ^^


bashfr.org(random);
<arciks1994> dou tu connai qel age j'ai ?

Hors ligne

#6 Le 23/03/2010, à 20:44

nesthib
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Re : [RESOLU] Sed : supprime ligne ne commencant pas par *:

@DiouxX :
tu fais tout un tas d'opérations inutiles, fais attention surtout si tu travailles avec de gros fichiers !

- sed a une option -i qui permet de modifier le fichier in situ
- tu peux enchaîner plusieurs commandes sed en même temps au lieu de traiter ton fichier deux ou trois fois de suite : séparation par des ; ou option -e

Hors ligne

#7 Le 24/03/2010, à 09:32

DiouxX
Membre

Re : [RESOLU] Sed : supprime ligne ne commencant pas par *:

nesthib a écrit :

@DiouxX :
tu fais tout un tas d'opérations inutiles, fais attention surtout si tu travailles avec de gros fichiers !

- sed a une option -i qui permet de modifier le fichier in situ

Je dois déployer ce script sur solaris 10 donc comme c'est du Unix, la commande sed est différente de celle pour GNU/Linux et entre autre l'option -i n'est pas présente. C'est pour cela, que je dois passer par des redirection de fichiers.


La confiance excessive ameublit le sol sous les pieds de la victoire.

Hors ligne

#8 Le 24/03/2010, à 09:36

DiouxX
Membre

Re : [RESOLU] Sed : supprime ligne ne commencant pas par *:

@ sputnick

vi: "Tmp file too large"
vi on Solaris systems can only edit files up to 134,184,960 bytes.

Si tu veux plus de précision, regarde ici

http://www.brandonhutchinson.com/vi__Tm … large.html

et mon fichier fais exactement 834Mo.

ET ce n'est pas un soucis de ram/swap car la machine de test à 128 Go de Ram ainsi que 16 coeurs

http://fr.sun.com/products/coolthreads/t5240/

Dernière modification par DiouxX (Le 24/03/2010, à 10:11)


La confiance excessive ameublit le sol sous les pieds de la victoire.

Hors ligne

#9 Le 24/03/2010, à 09:40

Totor
Membre

Re : [RESOLU] Sed : supprime ligne ne commencant pas par *:

Bonjour,

Tu n'es pas obligé de passer par des fichiers temporaires :

vi $1 >/dev/null <<EOF
:$2
dd
:x
EOF

EDIT : oups, si tu ne peux pas l'ouvrir ... ma commande ne sert à rien

Dernière modification par Totor (Le 24/03/2010, à 09:56)


-- Lucid Lynx --

Hors ligne

#10 Le 24/03/2010, à 10:58

credenhill
Membre

Re : [RESOLU] Sed : supprime ligne ne commencant pas par *:

essaye avec perl pour editer directement le fichier. enlever le .bak pour ne pas avoir de copie

$ cat a2
a: ligne à ne pas supprimer
ligne à supprimer 1
bcd: ligne à ne pas supprimer
ligne à supprimer 2
ligne à supprimer 3
$ 
$ perl -i.bak -n -e 'print if /^.*:/' a2
$ 
$ cat a2
a: ligne à ne pas supprimer
bcd: ligne à ne pas supprimer
$

Hors ligne