Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/10/2011, 14h34   #1
Membre du Club
 
Femme
Inscription : septembre 2011
Messages : 54
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : septembre 2011
Messages : 54
Points : 52
Points : 52
Par défaut Supprimer différents espaces dans ligne précise

Bonjour,

Supposons que j'ai cette ligne dans un fichier toto : Il fait beau "le ciel bleu".
Cette ligne est prise comme tel dans sed avec un seul espace séparant les mots :

Code :
sed -i.bak 's/^Il fait beau "le ciel est bleu"$/d' "toto"
Si j'ai des un ou plusieurs espaces dans ma ligne, comme :

Code :
Il  fait   beau    "le ciel est      bleu" (avec respectivement : 2, 3 et 4 espaces pour les mots avant les "" et 5 espaces entre  le est et bleu se trouvant entre les "".
Comment dire pour sed de supprimer cette ligne du fichier toto ou de la remplacer par une autre ligne malgré la présence des différents espaces ?

Résultat actuel : dès qu'il y a le moindre espace de différence entre la ligne du script et celle du fichioer toto, sed ne fait rien !!

Merci
bras39 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/10/2011, 14h51   #2
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 538
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 538
Points : 7 754
Points : 7 754
tu peux utiliser le répéteur

par exemple

Code :
sed 's/le.*ciel.*bleu//' fichier
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2011, 15h13   #3
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Salut,

Citation:
Envoyé par frp31 Voir le message
tu peux utiliser le répéteur

par exemple

Code :
sed 's/le.*ciel.*bleu//' fichier
Attention avec le "répéteur", il signifie tout aussi bien aucune occurrence, une occurrence ou plusieurs occurrences

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ echo -e 'le ciel est bleu\nIl  fait   beau    "le ciel est      bleu"\nbli bli bli\nlecielbleu' 
le ciel est bleu
Il  fait   beau    "le ciel est      bleu"
bli bli bli
lecielbleu
 
$ echo -e 'le ciel est bleu\nIl  fait   beau    "le ciel est      bleu"\nbli bli bli\nlecielbleu' | sed '/le.*ciel.*bleu/d'
bli bli bli
 
$ echo -e 'le ciel est bleu\nIl  fait   beau    "le ciel est      bleu"\nbli bli bli\nlecielbleu' | sed '/le.\+ciel.\+bleu/d'
bli bli bli
lecielbleu
 
$
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/10/2011, 15h57   #4
Membre du Club
 
Femme
Inscription : septembre 2011
Messages : 54
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : septembre 2011
Messages : 54
Points : 52
Points : 52
Merci de votre aide !

Ca marche, et voici mes tests à la fois pour et pour supprimer :

Fichier titi :

Code :
1
2
3
4
5
Il fait beau "le ciel est bleu"
Il fait beau "le ciel     est bleu"
Il fait beau "le ciel estbleu"
Il fait     beau "le ciel est bleu"
Ilfait beau "le ciel est bleu
Commandes sed pour remplacer et pour supprimer (ça remplace et supprime sans exception !) :

Code :
1
2
sed -i.bak -e 's/^Il.*fait.*beau.*"le.*ciel.*est.*bleu.*"$/Il fait beau "le ciel est bleu"/' "titi"
sed -i.bak -e '/^Il.*fait.*beau.*"le.*ciel.*est.*bleu.*"$/d' "titi"
Mais si on a un gros texte, y a t-il un moyen permettant de ne pas se taper à chaque fois les ".*" ?

Merci
~
bras39 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 04/10/2011, 03h57   #5
Expert Confirmé Sénior
 
Avatar de Sve@r
 
Homme Frédéric
Ingénieur développement logiciels
Inscription : février 2006
Messages : 3 055
Détails du profil
Informations personnelles :
Nom : Homme Frédéric
Âge : 44
Localisation : France, Oise (Picardie)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 3 055
Points : 4 934
Points : 4 934
Citation:
Envoyé par bras39 Voir le message
Mais si on a un gros texte, y a t-il un moyen permettant de ne pas se taper à chaque fois les ".*" ?
Salut

Puisque les espaces te gênent, retire-les de l'équation...

Code bash :
1
2
3
4
5
sed -e "s/ //g" titi |grep -n "Ilfaitbeau\"lecielestbleu\"" | cut -f1 -d: |while read pos
do
    sed -i.bak -e "${pos}d" titi
    sed -i.bak -e "${pos}s/^.\{1,\}$/Il fait beau \"le ciel est bleu\"/" titi
done
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit.
Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant.
Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation.
Dr. Adrian Rogers, 1931
Sve@r est déconnecté   Envoyer un message privé Réponse avec citation 11
Vieux 04/10/2011, 14h03   #6
Membre actif
 
Homme
Inscription : août 2011
Messages : 44
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : août 2011
Messages : 44
Points : 153
Points : 153
Bonjour,
Citation:
Envoyé par bras39 Voir le message
Mais si on a un gros texte, y a t-il un moyen permettant de ne pas se taper à chaque fois les ".*" ?
A supposer que tu utilises bash :
Code :
1
2
3
4
5
$ ligne='Il fait beau "le ciel est bleu"'
$ echo 'Il fait beau "le        ciel est          blaeu"'|sed "/^${ligne// / $'\{1,\}'}$/d"
Il fait beau "le        ciel est          blaeu"
$ echo 'Il fait beau "le       ciel est          bleu"'|sed "/^${ligne// / $'\{1,\}'}$/d"
$
Si ton shell ne permet pas l'utilisation de la syntaxe ${ligne// / $'\{1,\}'} :
Code :
1
2
3
4
5
6
$ ligne='Il fait beau "le ciel est bleu"'
$ ligne1="$(echo "${ligne}"|sed 's/ / \\{1,\\}/g')"
$ echo 'Il fait beau "le        ciel est          blaeu"'|sed "/^${ligne1}$/d"
Il fait beau "le        ciel est          blaeu"
$ echo 'Il fait beau "le       ciel est          bleu"'|sed "/^${ligne1}$/d"
$
chardclo est déconnecté   Envoyer un message privé Réponse avec citation 01
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h17.


 
 
 
 
Partenaires

Hébergement Web