Commande sed : besoin d'aide ...

Résolu/Fermé
momsse - 6 mai 2007 à 11:25
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 - 7 mai 2007 à 09:33
Bonjour,

Je suis en train de m'exercer à la commande sed, et un de mes exercices consiste à partir d'un fichier toto de supprimer chaque ligne tous les espaces et tab au début et à la fin de chaque ligne ...

Voila ce que j'ai essayé:

sed '/^.,$/s/[\t ]//' toto

Ca ne fonctionne evidemment pas... Pourquoi ? Je ne sais pas ...

Je remercie tous ceux qui y passeront un peu de temps !
A voir également:

10 réponses

En plus clair, il faut supprimer les tab et les espace en début et en fin de chaque ligne .
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
6 mai 2007 à 11:38
Salut,
sed 's/^[ \t]*//;s/[ \t]*$//'
;-))
0
Je te remercie, ca me permet de mieux comprendre certaine expression rationnelle de sed !

L'exercice suivant consiste cette fois ci a supprimer les lignes vides (uniquement des retour à la ligne \n), mais uniquement les premières recontrés du fichier toto, exemple:

toto(avant):



#au dessus il y a 4 lignes vides:
#au dessous il y en a 2:


toto(aprés):
#au dessus il y a 4 lignes vides
#au dessous il y en a 2



.................................................................................................................
Voila la tête de ma commande actuelle:

sed '/^\n*$/s/\n//1' toto

Une idée ?
0
Je précise que l'exercice consiste à n'utiliser que la commande s de sed et aucune autre (pas de commande d) ...
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
6 mai 2007 à 11:59
[jp@MDK tmpfs]$ cat plop



#au dessus il y a 4 lignes vides:
#au dessous il y en a 2:


[jp@MDK tmpfs]$ sed '/./,$!d' plop
#au dessus il y a 4 lignes vides: # Plus maintenant ;-))
#au dessous il y en a 2:


[jp@MDK tmpfs]$
;-))
0
Je te remercie mais comme indiqué je n'ai droit qu'a la commande s de sed, c'est ce qui rend l'exercice un peu plus coriace !

Une autre idée !

Merci encore pour tes réponses rapide !
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
6 mai 2007 à 12:30
Re-

Ça je ne pense pas que ce soit possible.

Dans le mécanisme de substitution avec le switch "s", on remplace une chaîne par une autre, on ne la détruit pas !
La seule façon (à mon sens) d'éliminer des lignes vides c'est de les "détruire", et la seule façon de faire c'est avec le switch "d" ...

;-/
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
J'aimerais aussi savoir pour ma compréhension pourquoi la commande suivante:

sed '/^\n/d' toto

Ne fonctionne pas, alors que ^\n corespond bien à l'adresse de lignes vides et pourquoi la commande qui suit fonctionne:

sed '/^\n*$/d'toto

Ca m'intrigue vraiment !
0
Encore une fois merci jipicy, tu pourrais m'expliquer la différence entre les 2 adresses suivantes:

/^\n/ et /^\n*$/

C'est dans le cadre de mon message précédant, j'avoue que je ne vois de différence avec la commande d mais pourtant la première ne fonctionne pas et la seconde ci ...
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
6 mai 2007 à 13:22
La 2nd marche car elle est plus proche de la bonne syntaxe qui normalement est :
sed '/^$/d' fichier
Je t'invite à jeter un oeil à cet article dans la FAQ faisant référence au fin de ligne : sed conversion retours chariots dos crlf unix lf

;-))
0
Un autre exercice, toujours avec la commande s de sed, on doit substituer la première occurence de toto par bobo (la première dans le fichier et non la première dans chaque ligne:

Ma commande est celle la:

sed 's/toto/bobo/1' toto

Comment s'arrêter a la première occurence du fichier et non a la première de chaque ligne ?

Merci encore pour l'aide !
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
6 mai 2007 à 14:41
sed '0,/toto/{s/toto/bobo/}'
;-))
0
momsse > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
6 mai 2007 à 14:50
Merci !

Tu pourrais me la décortiquer un peu pour le neuneu que je suis ... ?
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895 > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
6 mai 2007 à 15:02
0,/toto/ : Adressage. Depuis le début du fichier (0, avec certaines versions de "sed" il faut remplacer le "0" par "1", question d'interprétation) jusqu'à la 1ère occurrence de "toto".

{s/toto/bobo/} : Substitution. Bon là tu sais non ? ;-)) Note juste que les accolades sont facultatives.

;-))
0
Merci pour la décortication !

J'arrive au dernier exercice du chapitre sur sed et ca c'est je pense du haut niveau, voila ce qu'il faut faire:

En utilisant sed comme filtre, il faut écrire une commande sed de tel manière à ce qu'elle simule la commande basename, exemple:

echo '/usr/local/bolo' | commande sed
et
echo '/usr/local/bolo/' | commande sed
donne la sortie:
bolo


J'avoue ne même pas savoir par ou commencer ...
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
6 mai 2007 à 17:31
sed -e '/\/$/ s|||' -e 's|.*/\([a-z]*\)$|\1|'
Explications :

Déjà comme caractère séparateur on prend le pipe "|" au lieu du slash "/" pour ne pas interférer avec les slashs de la chaîne fournie en entrée (libre à toi d'en choisir un autre).

switch -e = permet d'enchaîner les commandes

1ère expression :

'/\/$/ s|||'

/\/$/ : Adressage. Si la chaîne se termine par un "slash" (/)
s|||' : On l'efface

2ème expression :

's|.*/\([a-z]*\)$|\1|'

.*/ : Tous caractères jusqu'à un slash
\(...\) : Permet d'isoler une sous-expression et d'y faire référence
\([a-z]*\)$ : Toutes chaînes alphabétique en fin de ligne
\1 : Affiche la référence à la sous-expression n°1

;-))
0
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426
7 mai 2007 à 00:25
Bonsoir vous deux,

Héhé, mon exercice préféré :)

Pour ce dernier exercice, j'aurais fais d'une pierre deux coups:
sed -r 's#^/.*/([a-zA-Z]+)/?$#\1#' 

Pour celui ou il faut utiliser exclusivement des substitution, bien que l'exercice soit idiot vu que les delete sont fait pour ça comme l'a précisé JP, j'ai une solution:
sed -nr '/./,$s/(.*)/\1/p' plop

Sauf si un print est considéré comme une commande bien sur.

Pour toto, je pensais m'en tirer en utilisant des branches, mais la solution proposée me semble de loin la plus simple donc la meilleure :)

@+
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895 > asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022
7 mai 2007 à 09:33
Salut Adrien,

Bien vu pour tout.

Merci ;-))
0
Parfait, mille merci pour l'explication, ca m'a vraiment été d'une trés grande aide, je vais maintenant mettre tous ce que j'ai appris en pratique !
0