Manipulation avec SED
Résolu/Fermé
tht123
Messages postés
72
Date d'inscription
mardi 8 mai 2007
Statut
Membre
Dernière intervention
10 janvier 2009
-
10 mai 2007 à 15:08
tht123 Messages postés 72 Date d'inscription mardi 8 mai 2007 Statut Membre Dernière intervention 10 janvier 2009 - 11 mai 2007 à 15:07
tht123 Messages postés 72 Date d'inscription mardi 8 mai 2007 Statut Membre Dernière intervention 10 janvier 2009 - 11 mai 2007 à 15:07
A voir également:
- Manipulation avec SED
- Mode anti manipulation involontaire - Guide
- Remplacez le mot sed par le mot mais dans tout le texte. combien de caractères contient le document suite à cette modification (en incluant les espaces) ? - Guide
- Sed - Remplacement texte par retour à la ligne ? ✓ - Forum Linux / Unix
- Sed et ses caprices (ou les miens) ✓ - Forum Linux / Unix
- Mauvaise manipulation - Forum Xiaomi
15 réponses
Jean-François Pillou
Messages postés
18707
Date d'inscription
lundi 15 février 1999
Statut
Webmaster
Dernière intervention
16 février 2023
63 274
10 mai 2007 à 15:14
10 mai 2007 à 15:14
1) Enlève le 'g', qui est un attribut 'global' pour toute la ligne :
2) A priori avec la regexp ci-dessus ça donne le résultat escompté !
sed '2,3s/le/LES/' test01.txt
2) A priori avec la regexp ci-dessus ça donne le résultat escompté !
dubcek
Messages postés
18755
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
14 novembre 2024
5 621
10 mai 2007 à 15:15
10 mai 2007 à 15:15
sed '2,3s/le/LES/1' test01.txt
mamiemando
Messages postés
33364
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
19 novembre 2024
7 801
10 mai 2007 à 15:15
10 mai 2007 à 15:15
1) Pour limiter le remplacement à une occurence, enlève le g à la fin du sed
2) Il suffit de lire ton fichier ligne par ligne
comment lire un fichier ligne par ligne
Bonne chance
2) Il suffit de lire ton fichier ligne par ligne
comment lire un fichier ligne par ligne
Bonne chance
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
10 mai 2007 à 15:23
10 mai 2007 à 15:23
Salut,
Voir aussi : sed substitution
;-))
Voir aussi : sed substitution
;-))
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
tht123
Messages postés
72
Date d'inscription
mardi 8 mai 2007
Statut
Membre
Dernière intervention
10 janvier 2009
10 mai 2007 à 15:34
10 mai 2007 à 15:34
1) Merci pour la solution d'une occurence par ligne!!!
2) Concernant l'adressage dans une ligne (ex: remplacer ou effacer les caractères 15 et 16 de chaque ligne) cela semble bien fonctionner sous linux.
Mais en fait il m'est imposé d'utiliser sed sous windows et donc je ne possède pas de possibilité de programmer des boucles.
Sans possibilité de programmer des boucles, serais-je devant une impasse?
Dores et déjà merci beaucoup.
2) Concernant l'adressage dans une ligne (ex: remplacer ou effacer les caractères 15 et 16 de chaque ligne) cela semble bien fonctionner sous linux.
Mais en fait il m'est imposé d'utiliser sed sous windows et donc je ne possède pas de possibilité de programmer des boucles.
Sans possibilité de programmer des boucles, serais-je devant une impasse?
Dores et déjà merci beaucoup.
mamiemando
Messages postés
33364
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
19 novembre 2024
7 801
10 mai 2007 à 15:44
10 mai 2007 à 15:44
Tu peux toujours lancer ta commande dans une commande shell (en séparant chaque ligne du script shell par des ';'). Exemple:
cd plop ; ls
tht123
Messages postés
72
Date d'inscription
mardi 8 mai 2007
Statut
Membre
Dernière intervention
10 janvier 2009
10 mai 2007 à 16:01
10 mai 2007 à 16:01
Excuse moi, mais Je ne te comprends pas.
BAT
BAT
mamiemando
Messages postés
33364
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
19 novembre 2024
7 801
10 mai 2007 à 17:25
10 mai 2007 à 17:25
En faisant un truc du genre
... tu peux écrire une boucle en une commande shell...
while read i; do echo -e "$i"; done < <(cat plop.txt)
... tu peux écrire une boucle en une commande shell...
tht123
Messages postés
72
Date d'inscription
mardi 8 mai 2007
Statut
Membre
Dernière intervention
10 janvier 2009
10 mai 2007 à 17:26
10 mai 2007 à 17:26
Bonjour j'ai une alternative mais cela coince ,
Pour le fichier de départ "test01.txt"
lundi le la les
lundi le la les
lundi le la le
lundi le la les
sed '2,3s/le/LES/2' test01.txt
La commande donne :
lundi le la les
lundi le la LESs
lundi le la LES
lundi le la les
Là où cela coince, c'est que SED remplace même le "le" de "les"...
???
BAT
Pour le fichier de départ "test01.txt"
lundi le la les
lundi le la les
lundi le la le
lundi le la les
sed '2,3s/le/LES/2' test01.txt
La commande donne :
lundi le la les
lundi le la LESs
lundi le la LES
lundi le la les
Là où cela coince, c'est que SED remplace même le "le" de "les"...
???
BAT
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
10 mai 2007 à 18:44
10 mai 2007 à 18:44
Là où cela coince, c'est que SED remplace même le "le" de "les"...
Ben c'est normal tu le lui demandes implicitement avec le "2" en fin de commande !
Ben c'est normal tu le lui demandes implicitement avec le "2" en fin de commande !
sed '2,3s/le/LES/' test01.txt;-)
mamiemando
Messages postés
33364
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
19 novembre 2024
7 801
10 mai 2007 à 18:37
10 mai 2007 à 18:37
Pour ne catcher que les "le" suivi d'un ' ' :
après je ne sais pas si ça fait ce que tu veux...
sed '2,3s/le /LES/2' plop.txt
après je ne sais pas si ça fait ce que tu veux...
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
10 mai 2007 à 18:45
10 mai 2007 à 18:45
Salut,
ça ne marche pas, puisque tu obliges d'avoir un espace après le et ce n'est pas toujours le cas
ça ne marche pas, puisque tu obliges d'avoir un espace après le et ce n'est pas toujours le cas
lami20j@debian:~/trash$ cat test01.txt lundi le la les lundi le la les lundi le la le lundi le la les lami20j@debian:~/trash$ sed '2,3s/le /LES/2' test01.txt lundi le la les lundi le la les lundi le la le lundi le la les
mamiemando
Messages postés
33364
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
19 novembre 2024
7 801
>
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
10 mai 2007 à 18:53
10 mai 2007 à 18:53
Exact
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
10 mai 2007 à 18:43
10 mai 2007 à 18:43
Salut,
Là où cela coince, c'est que SED remplace même le "le" de "les"...
Ben, ça ne coince pas.
En réalité le moteur des regex n'est pas très intelligent. En revanche il est très persévérant et exhaustif. Donc ce qui coince c'est plutôt la manière dont on écrit et utilise une regex
Dans ton cas le moteur s'en fiche complètement de ce que tu veux obtenir. Lui il cherche un le et il le remplace comme tu l'as demandé. Et comme tu n'as pas fait des demandes particulières, le moteur cherche la 2ème occurrence de le dans les lignes 2 à 3 n'importe s'il fait ou non partie d'un mot.
Il faut spécifier au moteur que tu cherche à remplacer un
Essaie comme ça
Là où cela coince, c'est que SED remplace même le "le" de "les"...
Ben, ça ne coince pas.
En réalité le moteur des regex n'est pas très intelligent. En revanche il est très persévérant et exhaustif. Donc ce qui coince c'est plutôt la manière dont on écrit et utilise une regex
Dans ton cas le moteur s'en fiche complètement de ce que tu veux obtenir. Lui il cherche un le et il le remplace comme tu l'as demandé. Et comme tu n'as pas fait des demandes particulières, le moteur cherche la 2ème occurrence de le dans les lignes 2 à 3 n'importe s'il fait ou non partie d'un mot.
Il faut spécifier au moteur que tu cherche à remplacer un
caractère non mot suit d'un l suit d'un e suit d'un autre caractère non motou plutôt
une assertion nulle début de mot suit d'un l suit d'un e suit d'une assertion nulle fin de motDonc il faut ancrer ton motif.
Essaie comme ça
lami20j@debian:~/trash$ cat test01.txt lundi le la les lundi le la les lundi le la le lundi le la les lami20j@debian:~/trash$ sed '2,3s/\ble\b/LES/2' test01.txt lundi le la les lundi le la les lundi le la LES lundi le la les lami20j@debian:~/trash$ sed '2,3s/\<le\>/LES/2' test01.txt lundi le la les lundi le la les lundi le la LES lundi le la les
Jean-François Pillou
Messages postés
18707
Date d'inscription
lundi 15 février 1999
Statut
Webmaster
Dernière intervention
16 février 2023
63 274
10 mai 2007 à 22:47
10 mai 2007 à 22:47
Si vous ne souhaitez pas qu'il capture 'le' s'il fait partie d'un mot :
\b représente une limite de mot !
sed '2,3s/\ble\b/LES/' test01.txt
\b représente une limite de mot !
tht123
Messages postés
72
Date d'inscription
mardi 8 mai 2007
Statut
Membre
Dernière intervention
10 janvier 2009
10 mai 2007 à 23:14
10 mai 2007 à 23:14
Merci Jeff, et à tous les autres!!
SED est vraiment puissant une fois que l'on connait les commandes et syntaxes mais malheureusement mal docummenté à priori
Enfin, votre aide m'a beaucoup aidé
A bientôt!
SED est vraiment puissant une fois que l'on connait les commandes et syntaxes mais malheureusement mal docummenté à priori
Enfin, votre aide m'a beaucoup aidé
A bientôt!
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
11 mai 2007 à 08:38
11 mai 2007 à 08:38
Salut,
SED est vraiment puissant une fois que l'on connait les commandes et syntaxes
En effet, SED et très puissant.
Cependant ici il ne s'agit pas de SED mais des expressions régulières (regex).
Les regex ne sont pas implémentées de la même façon dans toutes les langages (awk, perl, python, java, php, etc.) et dans toutes les commandes (sed, grep etc.) qui les utilisent donc avant de les utiliser il faut consulter la doc.
En conclusion il faut les étudier avant de les utiliser pour éviter les résultats inattendues.
Il y a plein des choses à apprendre en ce qui concerne les regex. Voici une petite liste :
- les métacaractères
- les classes de caractères
- la gurmandise et la paresse des quantificateurs
- les quantificateurs possessifs
- la capture et les parenthèses non-capturantes
- les références arrières
- le groupement atomique
- les assertions de largeur nulle ( les ancrages ) et non-nulle
- les alternatives
- les test avant et arrières (positives ou négatives)
- les modificateurs de regex
etc.
En fait les regex c'est un mini langage qui a ses métacarctères qu'il faut les connaître.
C'est aussi très important de connaitre la mécanique des regex ( les moteurs NFA et DFA)
Tous ces langages partagent un même moteur, de type NFA (Nondeterministic Finite Automation). MySQL, awk et egrep, par contre, utilisent un autre type de moteur (DFA - Deterministic Finite Automation) plus simple, moins puissant mais plus rapide pour les cas (très) simples, voir simplistes ("Talking about DFA matching is very boring!" Jeffrey Friedl).
En bref, les regex sont très puissantes.
Quand vous aurez appris les expressions régulières, vous vous rendrez compte qu'elles constituent une partie inestimable de votre boîte à outils... by Jeffrey E.F. Friedl - Maîtrise des expressions régulières
--
lami20j
SED est vraiment puissant une fois que l'on connait les commandes et syntaxes
En effet, SED et très puissant.
Cependant ici il ne s'agit pas de SED mais des expressions régulières (regex).
Les regex ne sont pas implémentées de la même façon dans toutes les langages (awk, perl, python, java, php, etc.) et dans toutes les commandes (sed, grep etc.) qui les utilisent donc avant de les utiliser il faut consulter la doc.
En conclusion il faut les étudier avant de les utiliser pour éviter les résultats inattendues.
Il y a plein des choses à apprendre en ce qui concerne les regex. Voici une petite liste :
- les métacaractères
- les classes de caractères
- la gurmandise et la paresse des quantificateurs
- les quantificateurs possessifs
- la capture et les parenthèses non-capturantes
- les références arrières
- le groupement atomique
- les assertions de largeur nulle ( les ancrages ) et non-nulle
- les alternatives
- les test avant et arrières (positives ou négatives)
- les modificateurs de regex
etc.
En fait les regex c'est un mini langage qui a ses métacarctères qu'il faut les connaître.
C'est aussi très important de connaitre la mécanique des regex ( les moteurs NFA et DFA)
Tous ces langages partagent un même moteur, de type NFA (Nondeterministic Finite Automation). MySQL, awk et egrep, par contre, utilisent un autre type de moteur (DFA - Deterministic Finite Automation) plus simple, moins puissant mais plus rapide pour les cas (très) simples, voir simplistes ("Talking about DFA matching is very boring!" Jeffrey Friedl).
En bref, les regex sont très puissantes.
Quand vous aurez appris les expressions régulières, vous vous rendrez compte qu'elles constituent une partie inestimable de votre boîte à outils... by Jeffrey E.F. Friedl - Maîtrise des expressions régulières
--
lami20j
tht123
Messages postés
72
Date d'inscription
mardi 8 mai 2007
Statut
Membre
Dernière intervention
10 janvier 2009
11 mai 2007 à 15:07
11 mai 2007 à 15:07
Merci encore à tous pour cet aflux impressionant de réponses!!!