Script Bash : grep + sed Le sujet est résolu

Tout ce qui concerne la programmation.
Répondre
Avatar de l’utilisateur
dezix
Membre hyper actif
Membre hyper actif
Messages : 3546
Inscription : 04 juin 2016, 14:50
Status : Hors-ligne

Bonjour,

Je bute sur un truc sans-doute tout bête :010:

Le contexte:

Zim (wiki de bureau) utilise des fichier.txt
qui permettent la création de Tâches — ligne débutant par une case à cocher — de la façon suivante :

[ ] libellé de l'action à accomplir

ces cases peuvent également être cochées, annulées, transférées (respectivement : [*] ; [x] ; [>] )

d'autre part Zim permet aussi de créer des étiquettes suivant le format : @exemple (1mot)

ces étiquettes permettent de filtrer les Tâches par catégories.


Mon problème


La commande :

find /chemin/ -type f -name "*.txt" -exec sed -i 's/^\[ \]/\[>\]/g' '{}' \;

permet de modifier dans l'arborescence sous-jacente à /chemin/ toutes les lignes des fichiers .txt

[ ] libellé de l'action à accomplir
en
[>] libellé de l'action à accomplir

ce que je veux => ne modifier parmi ces lignes uniquement celles qui contiennent le motif @next

la solution doit être un simple grep @next

mais je ne connais pas la règle de "grammaire" pour cela dans ce contexte.


Merci pour vos suggestions et explications .
**Simple Utilisateur** -- Debian stable - XFCE
Avatar de l’utilisateur
dezix
Membre hyper actif
Membre hyper actif
Messages : 3546
Inscription : 04 juin 2016, 14:50
Status : Hors-ligne

La solution :

Une fonction de filtrage équivalente à grep est incluse dans SED


sed '/<chain3>/s/<chain1>/<chain2>/'



permet de remplacer <chain1> par <chain2> uniquement pour les lignes contenant <chain3>



Dans l'exemple de #1 ça donne :

find /chemin/ -type f -name "*.txt" -exec sed -i '/@next/s/^\[ \]/\[>\]/g' '{}' \;

tout simplement.

Merci SED !
**Simple Utilisateur** -- Debian stable - XFCE
Avatar de l’utilisateur
piratebab
Site Admin
Site Admin
Messages : 4905
Inscription : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : Hors-ligne

TOi, tu as lu la doc :)
Sage réflexe qui a tendance à se perdre ..
Avatar de l’utilisateur
vv222
Membre actif
Membre actif
Messages : 852
Inscription : 18 avr. 2016, 20:14
Contact :
Status : Hors-ligne

dezix a écrit : 27 mars 2019, 11:13 La solution :

Une fonction de filtrage équivalente à grep est incluse dans SED

sed '/<chain3>/s/<chain1>/<chain2>/'

permet de remplacer <chain1> par <chain2> uniquement pour les lignes contenant <chain3>
Oh, merci pour le partage !
Je ne connaissais pas cette possibilité de sed, dans ces situations j'utilisais jusqu'ici quasi systématiquement awk.
Avatar de l’utilisateur
lol
Site Admin
Site Admin
Messages : 4959
Inscription : 04 avr. 2016, 12:11
Localisation : Madagascar
Status : Hors-ligne

piratebab a écrit : 28 mars 2019, 08:01TOi, tu as lu la doc :)
Sage réflexe qui a tendance à se perdre ..

ET tu partage la solution. Magnifique! :yahoo:
Règles d'usage du forum. Signalez si vous avez posté votre question sur un autre forum. Explications ici
Debian Unstable. Mate/LXQT. Dieu, en créant l'homme, a quelque peu surestimé ses capacités.
Avatar de l’utilisateur
dezix
Membre hyper actif
Membre hyper actif
Messages : 3546
Inscription : 04 juin 2016, 14:50
Status : Hors-ligne

piratebab a écrit : 28 mars 2019, 08:01 TOi, tu as lu la doc :)
Sage réflexe qui a tendance à se perdre ..
OUI ! j'ai lu la doc ... mais cela n'a pas suffit :dirol:

Je n'ai pigé la doc qu'après qu'on m'ai fourni la réponse sur LinuxQuestion :shout:
**Simple Utilisateur** -- Debian stable - XFCE
Répondre