Rechercher : dans
Par :

Commande sed : besoin d'aide ...

Dernière réponse le 7 mai 2007 à 09:33:00 momsse, le 6 mai 2007 à 11:25:56 
 Signaler ce message aux modérateurs

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 !

Configuration: Mac PowerPC
Firefox 2.0.0.1

Meilleures réponses pour « Commande sed : besoin d'aide ... » dans :
Sed - Introduction à SED - Part III VoirSED - The Stream EDitor - Part III Ce document est une introduction à la pratique et à l'utilisation de l'éditeur de flux "SED", qui essaie de couvrir certaines fonctionnalités assez méconnues, pour ne pas dire "quasi inconnues", qui font de "SED"...
Sed - Introduction à SED - Part I VoirSED - The Stream EDitor - Part I Ce document est une introduction à la pratique et à l'utilisation de l'éditeur de flux "SED", qui essaie de couvrir certaines fonctionnalités assez méconnues, pour ne pas dire "quasi inconnues", qui font de "SED" un...
Sed - Insérer un espace entre chaque lettre VoirInsérer un espace entre chaque lettre $ echo -e "bonjour la vie\net bonjour à toi" | sed 's/./& /g' b o n j o u r l a v i e e t b o n j o u r à t o iL'inconvénient c'est que l'espace naturel entre chaque mot est doublé. Pour pallier à...
Télécharger Atelier Web Remote Commander VoirSi vous vous souciez de la maintenance et de l’optimisation de votre ordinateur, même quand vous n’êtes devant, utilisez des programmes de commande à distance. Atelier Web Remote Commander (AWRC) est un outil puissants conçu pour la...
Commandes Linux VoirTableau des principales commandes Linux Commande Description équivalent DOS ls liste le contenu d'un répertoire dir cd change de répertoire cd cd .. répertoire parent cd.. mkdir crée un nouveau...
Commandes UNIX VoirTableau des principales commandes UNIX Commande Unix Description Options ls liste le contenu d'un répertoire -a Affiche tous les fichiers, y compris les fichiers cachés ...
Les commandes AS/400 VoirLes commandes de l’AS/400 Il existe environ un millier de commandes dans l'OS/400, regroupées sous le nom de « Langage de Contrôle ». Un utilisateur pourra les lancer depuis la ligne Option ou Commande située au bas de l'écran, quand celle-ci est...

1

momsse, le 6 mai 2007 à 11:28:42

En plus clair, il faut supprimer les tab et les espace en début et en fin de chaque ligne .

Répondre à momsse

2

jipicy, le 6 mai 2007 à 11:38:54

Salut,

sed 's/^[ \t]*//;s/[ \t]*$//'
;-))
Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

3

momsse, le 6 mai 2007 à 11:54:03

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 ?

Répondre à momsse

4

momsse, le 6 mai 2007 à 11:57:17

Je précise que l'exercice consiste à n'utiliser que la commande s de sed et aucune autre (pas de commande d) ...

Répondre à momsse

5

jipicy, le 6 mai 2007 à 11:59:39

[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]$
;-))
Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

6

momsse, le 6 mai 2007 à 12:06:11

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 !

Répondre à momsse

8

jipicy, le 6 mai 2007 à 12:30:19

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" ...

;-/ Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

7

momsse, le 6 mai 2007 à 12:29:05

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 !

Répondre à momsse

9

momsse, le 6 mai 2007 à 12:44:07

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 ...

Répondre à momsse

10

jipicy, le 6 mai 2007 à 13:22:30

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

;-)) Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

11

momsse, le 6 mai 2007 à 14:13:43

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 !

Répondre à momsse

12

jipicy, le 6 mai 2007 à 14:41:08

sed '0,/toto/{s/toto/bobo/}'
;-))
Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

13

momsse, le 6 mai 2007 à 14:50:52

Merci !

Tu pourrais me la décortiquer un peu pour le neuneu que je suis ... ?

Répondre à momsse

14

jipicy, le 6 mai 2007 à 15:02:50

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.

;-)) Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

15

momsse, le 6 mai 2007 à 16:34:22

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 ...

Répondre à momsse

16

jipicy, le 6 mai 2007 à 17:31:37

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

;-))
Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

18

asevere, le 7 mai 2007 à 00:25:01

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 :)

@+ Une belette, un lapin !?
C'est pas normal!

Répondre à asevere

19

 jipicy, le 7 mai 2007 à 09:33:00

Salut Adrien,

Bien vu pour tout.

Merci ;-)) Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

17

momsse, le 6 mai 2007 à 18:10:02

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 !

Répondre à momsse