Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".
Test de l'ISO d'Ubuntu francophone : nous avons besoin de testeurs pour la version francophone d'Ubuntu 14.04. Liens et informations ici.

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

DiouxX

[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, à 11:24)


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

Hors ligne

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

credenhill

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, à 10:45

Totor

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

Bonjour,

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

-- Lucid Lynx --

Hors ligne

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

DiouxX

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, à 19:59

sputnick

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, à 21:44

nesthib

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


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

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

DiouxX

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, à 10:36

DiouxX

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, à 11:11)


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

Hors ligne

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

Totor

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, à 10:56)


-- Lucid Lynx --

Hors ligne

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

credenhill

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

Haut de page ↑