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

Tout ce qui concerne la programmation.
Répondre
Avatar du membre
dezix
Membre
Membre
Messages : 432
Enregistré le : 04 juin 2016, 14:50
Diaspora* : dezix@framasphere.org
Status : Hors ligne

26 mars 2019, 17:04

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 .
Debian testing/stable - XFCE
Avatar du membre
dezix
Membre
Membre
Messages : 432
Enregistré le : 04 juin 2016, 14:50
Diaspora* : dezix@framasphere.org
Status : Hors ligne

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>



Dans l'exemple de #1 ça donne :

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

tout simplement.

Merci SED !
Debian testing/stable - XFCE
Avatar du membre
piratebab
Site Admin
Site Admin
Messages : 2902
Enregistré le : 24 avr. 2016, 18:41
Localisation : sud ouest
Status : En ligne

28 mars 2019, 08:01

TOi, tu as lu la doc :)
Sage réflexe qui a tendance à se perdre ..
Avatar du membre
vv222
Modérateur
Modérateur
Messages : 350
Enregistré le : 18 avr. 2016, 20:14
Localisation : Bretagne
Contact :
Status : Hors ligne

28 mars 2019, 12:35

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 du membre
lol
Membre hyper actif
Membre hyper actif
Messages : 2952
Enregistré le : 04 avr. 2016, 12:11
Localisation : Madagascar
Contact :
Status : Hors ligne

28 mars 2019, 17:20

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

ET tu partage la solution. Magnifique! :yahoo:
Debian SID. XFCE.
C'est curieux chez les marins ce besoin de faire des phrases (Les tontons flingueurs).
Générateur de sources.list!
Avatar du membre
dezix
Membre
Membre
Messages : 432
Enregistré le : 04 juin 2016, 14:50
Diaspora* : dezix@framasphere.org
Status : Hors ligne

30 mars 2019, 11:14

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:
Debian testing/stable - XFCE
Répondre