Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
2201 connectés 

  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  [Bash] Substitution d'une lettre

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Bash] Substitution d'une lettre

n°1416251
victoria33
Posté le 19-03-2018 à 21:33:35  profilanswer
 

Bonjour,  
 
Je débute en bash et je dois répondre à la question suivante: "Donnez la commande sed qui permet de remplacer la 2ème lettre de chaque mot d'un texte par un X."
Sauf que je ne comprend vraiment pas comment "sélectionner" la deuxième lettre.
Si je devais remplacer la première lettre par un X, je ferai:
$ cat texte.txt | sed 's/^.\| [a-z]/\ X/g'
Mais pour sélectionner la deuxième lettre... aucune idée et je ne parviens pas, malgré mes nombreuses recherches, à comprendre...
 
Donc si quelqu'un a la possibilité de m'expliquer comment on sélectionne une lettre / une ligne etc. dans ce genre de commande, je suis preneuse, car je ne maîtrise vraiment pas... A part que ^ désigne le début d'un mot et le point un caractère quelconque, je suis dans le flou total.
 
J'en profite également pour demander si vous avez des ressources (livres, sites etc.) sur le langage Bash à me proposer, adaptés à quelqu'un qui débute, histoire d'acquérir les bases (en français ou en anglais, peu importe).
 
Merci beaucoup d'avoir pris le temps de me lire!

mood
Publicité
Posté le 19-03-2018 à 21:33:35  profilanswer
 

n°1416277
zipe31
Posté le 20-03-2018 à 10:47:11  profilanswer
 

Salut,
 

Code :
  1. sed -r 's/([[:alpha:]])([[:alpha:]])([^ ]*( |$))/\1X\3/g' fichier


 
-r permet de ne pas avoir à protéger les caractères tels que parenthèse, crochet, accolade, etc.
(...) Permettent de jouer avec les sous-expressions et références arrières (voir http://www.commentcamarche.com/faq [...] s-arrieres)
[^ ]* permet de faire correspondre n'importe quelle suite de caractère jusqu'à ce qu'on rencontre un espace.
 
 ;)


---------------
$ man woman
n°1416309
victoria33
Posté le 20-03-2018 à 16:47:02  profilanswer
 

Merci beaucoup pour la réponse!
 
Du coup je me pose quelques questions à propos de la ressource http://www.commentcamarche.com/faq [...]s-arrieres.
 
Ils partent du fichier de référence suivant:

Citation :

$ cat plop
31000 Toulouse
34000 Montpellier
66000 Perpignan


 
et on souhaite obtenir les 2 résultats suivants:
 
1)  
31000
34000
66000

Citation :

$ sed 's/([0-9]*).*/\\1/' plop

Or je ne comprend pas pourquoi le double antislash, le \1 sert à faire référence à la sous expression du code postal mais je ne comprend pas pourquoi il y en a un autre devant...
 
2)
Toulouse > 31000
Montpellier > 34000
Perpignan > 66000

Citation :

$ sed 's/([0-9]*)t(.*)/2 > 1/' plop

Cette fois-ci, je ne comprend pas pourquoi il n'y a plus d'antislash pour faire référence au 1 et au 2. J'aurai personnellement noté :  
$ sed 's/([0-9]*)t(.*)/\2 > \1/' plop
 
Il y a aussi (pour les deux exemples ci-dessus) le fait qu'on note la sous-expression: ([0-9]*), ne doit-on pas la noter: \([0-9]*\) avec un antislash devant chaque parenthèse?
 
Voilà s'il y a des gens motivés pour m'expliquer ce point n'hésitez pas parce que j'ai un vrai problème de compréhension pour l'usage des antislash... (oui, je pars de loin!)  :(  
 

n°1416310
zipe31
Posté le 20-03-2018 à 17:41:44  profilanswer
 

Oups  :??:  Il y a un moment que je n'avais pas jeté un oeil plus averti à cette FAQ. Avec les changements successifs du site CommentÇaMarche, la mise en page de la FAQ a pris du plomb dans l'aile  :(  
 
Il y a quelques anti-slashs qui ont sauté et quelques uns qui sont apparus là où il ne faudrait pas  :pfff:  
 
Donc, il fallait lire ceci :
 

Code :
  1. $ cat plop
  2. 31000 Toulouse
  3. 34000 Montpellier
  4. 66000 Perpignan


 

Code :
  1. $ sed 's/\([0-9]*\).*/\1/' plop
  2. 31000
  3. 34000
  4. 66000
  5. $ sed 's/\([0-9]*\)\t\(.*\)/\2 > \1/' plop
  6. Toulouse > 31000
  7. Montpellier > 34000
  8. Perpignan > 66000


 
Désolé pour la confusion  :whistle:

n°1416311
victoria33
Posté le 20-03-2018 à 17:54:34  profilanswer
 

Merci pour la réponse, ça me parait bien plus clair comme ça! :)

n°1418328
alokkin
tourner 7 fois la langue ...
Posté le 08-05-2018 à 18:54:49  profilanswer
 

PS : si tu veux te passer des antislashs devant les parenthèses "capturantes" tu peux utiliser le switch -r (ou -E si tu veux être compatible osx) pour utiliser les expressions régulières étendues.
 
sed -r 's/([0-9]+).*$/\1/' plop
31000
34000
66000


Message édité par alokkin le 08-05-2018 à 18:56:24

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  [Bash] Substitution d'une lettre

 

Sujets relatifs
Monter disque dur synology sur le bash windows 10[Code et Script][bash] test et arguments
slinuxjjhjbash : wtf ?
Serveur sur WSL(Bash Ubuntu @Windows) ou VM/Debian[bash] faire une boucle for sur une seul ligne
lancer un bash avec php-apache[Bash] Restreindre sed ou awk à une colonne d'un fichier csv
Aide script modification HTML bashScript BASH pour suppression fichiers multiples (même nom) dans arbo ?
Plus de sujets relatifs à : [Bash] Substitution d'une lettre


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR