#1 Le 23/03/2010, à 09: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, à 10:24)
La confiance excessive ameublit le sol sous les pieds de la victoire.
Hors ligne
#2 Le 23/03/2010, à 09: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, à 09:45
- Totor
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
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
Re : [RESOLU] Sed : supprime ligne ne commencant pas par *:
... 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 ^^
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#6 Le 23/03/2010, à 20: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 : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne
#7 Le 24/03/2010, à 09:32
- DiouxX
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
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
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
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
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