Bonjour,
Je cherche depuis des heures comment afficher le texte contenu à l'intérieur de crochets [texte] avec sed ou awk sans succès.
Pouvez-vous m'éclairer sur l'utilisation de la commande sed ou awk à passer svp ?
Merci.
Cordialement.
Bonjour,
Je cherche depuis des heures comment afficher le texte contenu à l'intérieur de crochets [texte] avec sed ou awk sans succès.
Pouvez-vous m'éclairer sur l'utilisation de la commande sed ou awk à passer svp ?
Merci.
Cordialement.
Salut,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 echo '[texte entre crochets]' | sed -e 's/\[\(.*\)\]/\1/' texte entre crochets
Merci de votre réponse.
Et une dernière chose, si je veux afficher seulement ce qu'il y a entre crochet dans un fichier texte et ignorer le reste du texte, avez-vous une idée svp ?
Exemple :
Je sais parcourir avec une boucle le fichier afin de le lire ligne par ligne, mais maintenant, comment n'afficher que GLOBAL ?LOG = /var/log/err.log
domain = domain.tld
[GLOBAL]
login = pseudo...
J'ai essayé d'adapter avec ce que vous avez répondu et un délimiteur, mais cela ne marche pas.
Merci à vous.
Cordialement.
En utilisant la même méthode que Mygale1978 t'a donné et en rajoutant des ".*"
Je te conseille de regarder comment fonctionne sed, ça te permettra de mieux comprendre ce qu'il se passe
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 echo 'texte [entre] crochets' | sed -e 's/.*\[\(.*\)\].*/\1/' entre
Merci beaucoup.
En effet, je me document sur SED mais je trouve ça assez complexe ^^.
Bonjour,
La regex n'est pas super, elle ne fonctionne pas pour par exemple :
ou
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 $ echo 'totot [eyeyey] titi [yuyuyuy]' | sed -e 's/.*\[\(.*\)\].*/\1/' yuyuyuy
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 $ echo 'totot eyeyey titi yuyuyuy' | sed -e 's/.*\[\(.*\)\].*/\1/' totot eyeyey titi yuyuyuy
Exact, ça ne marche que s'il n'y a qu'une seule fois maximum les crochets dans chaque ligne.
Hum. -1. Tu recrées des outils existants.
sed parcourt déjà ligne par ligne pour modifier le texte
awk parcourt déjà ligne par ligne en prenant en compte chaque champ.
grep parcourt déjà ligne par ligne en filtrant.
J'appelle exemple.txt ton exemple.
Si ton but est de réécrire à ta façon: Avec awk:
Le deuxième est en supprimant les catégories [GLOBAL], etc...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 $ cat exemple.txt LOG = /var/log/err.log domain = domain.tld [GLOBAL] login = pseudo... $ awk -F' = ' '{printf "Variable: %10s Valeur: %10s\n",$1,$2}' exemple.txt Variable: LOG Valeur: /var/log/err.log Variable: domain Valeur: domain.tld Variable: [GLOBAL] Valeur: Variable: login Valeur: pseudo... $ awk -F' = ' '!/^\[/{printf "Variable: %10s Valeur: %10s\n",$1,$2}' exemple.txt Variable: LOG Valeur: /var/log/err.log Variable: domain Valeur: domain.tld Variable: login Valeur: pseudo... $
Si ton but est vraiment de récupérer toutes les valeurs entre crochets, l'option o de grep peut t'aider:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 $ echo "bla[Global] bmada [toto] ge [tata] [tutu] egg [[polo]]"|egrep -o "\\[[^][]*\\]"| sed -e 's/\[\(.*\)\]/\1/' Global toto tata tutu polo $
Si ton souhait est de manipuler les variables dans un script bash, peut-être est-il malin de sourcer ton fichier (une fois débarrassé des catégories entre crochets, et suprimer les espaces autour des '=')
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 $ . <( sed -n '/^\[/!s/ = /=/p' exemple.txt ) $ echo $LOG /var/log/err.log $ echo $login pseudo... $
Voici aussi une manière de faire juste avec grep:
Pour la petite histoire, l'option -P permet d'utiliser le moteur de regex de perl qui permet de faire du "lookbehind" ou du "lookahead".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 $ echo "bla[Global] bmada [toto] ge [tata] [tutu] egg [[polo ss]]" | grep -o -P '(?<=\[)[^[]*[^]](?=\])' Global toto tata tutu polo ss $
(?<=\[)XXX ==> match les XXX précédé par un "[" (Positive lookbehind)
XXX(?=\]) ==> match les XXX suivi de "]" (Positive lookahead)
si on remplace le '=' par '!', cela devient respectivement des Negative lookbehind et Negative lookahead pour dire non précédé ou non suivi.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager