Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 23/10/2022, à 19:14

PowaBanga

[Bash] retourner la valeur entre deux caractères avec retours (Résolu)

Salut à tous,
voici un fichier auquel j'ai à faire :

not_a_string=('do' 'not' 'return' 'this')
    string=(
'here' 'are' 'some' 'strings' 'to' 'return'
)
yet_not_a_string=(
'not'
'return'
'this'
'too'
)

Dans ce fichier, je dois récupérer les valeurs qui sont entre parhentèses, à la suite d'un des trois valeurs qui sont spécifiquement avant un "="
donc :

not_a_string devrait retourner :
`do not return this`

string devrait retourner :
`here are some strings to return`

et yet_not_a_string devrait retourner
`not return this too`

Je voudrais pouvoir récupérer les valeur voulue à la sortie d'un `cat` sur le fichier combiné avec des `| grep` `|sed` `|cut` ou autre

ici je suis particulièrement embêté par les valeurs contenue entre parenthèses après "    string=(" car il contient des retours à la ligne

du coup, si je fait

cat monfichier | grep -e "^string"

cela me retournera la ligne string, sans les valeurs qui l’accompagne  ensuite entre parenthèses.

Si quelqu'un savait m'éclairer ça serait tip top ! smile

Dernière modification par PowaBanga (Le 25/10/2022, à 18:19)

Hors ligne

#2 Le 23/10/2022, à 20:05

Watael

Re : [Bash] retourner la valeur entre deux caractères avec retours (Résolu)

c'est moi, ou ça ne veut rien dire ?

il doit manquer quelque chose d'évident pour PowaBanga, mais qu'il n'expose pas ici. sad

Dernière modification par Watael (Le 23/10/2022, à 20:17)


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#3 Le 23/10/2022, à 20:23

Tawal

Re : [Bash] retourner la valeur entre deux caractères avec retours (Résolu)

Hello,

À question ambiguë, réponse ambiguë :
Essaie de sourcer le fichier.

source /chemin/du/fichier
echo "${string[@]}"

Edit:
correction d'une erreur : strings ==> string

Dernière modification par Tawal (Le 24/10/2022, à 08:34)


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#4 Le 24/10/2022, à 05:24

PowaBanga

Re : [Bash] retourner la valeur entre deux caractères avec retours (Résolu)

Merci pour ton message watael, il semble en effet que j'ai manqué de clareté. J'ai donc édité mon premier message. Est-il plus clair à présent ?

Hors ligne

#5 Le 24/10/2022, à 06:19

matrix-bx

Re : [Bash] retourner la valeur entre deux caractères avec retours (Résolu)

Salut,

$ tr -d \\n < monfichier | sed s"/)/)\\n/g"
not_a_string=('do' 'not' 'return' 'this')
    string=('here' 'are' 'some' 'strings' 'to' 'return')
yet_not_a_string=('not''return''this''too')
$

Cela te conviendrait-il ?


Utilisations des balises de mises en formes.

Hors ligne

#6 Le 24/10/2022, à 08:31

Tawal

Re : [Bash] retourner la valeur entre deux caractères avec retours (Résolu)

@PowaBanga :
Tu nous montres un fichier de données qui définit des tableaux en bash.
Si ce fichier ne contient que des données de ce type alors ma solution est viable.
Tu sources le fichier, et tu récupères donc les tableaux définis dans ce fichier.
Cela fonctionne aussi bien dans un terminal que dans un script.

source le_fichier_de_données
echo "Tableau string : ${string[@]}"
echo "Tableau not_a_string : ${not_a_string[@]}"
echo "Tableau yet_not_a_string : ${yet_not_a_string[@]}"

Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#7 Le 24/10/2022, à 08:48

matrix-bx

Re : [Bash] retourner la valeur entre deux caractères avec retours (Résolu)

Tawal a écrit :

@PowaBanga :
Tu nous montres un fichier de données qui définit des tableaux en bash.
Si ce fichier ne contient que des données de ce type alors ma solution est viable.
Tu sources le fichier, et tu récupères donc les tableaux définis dans ce fichier.
Cela fonctionne aussi bien dans un terminal que dans un script.

source le_fichier_de_données
echo "Tableau string : ${string[@]}"
echo "Tableau not_a_string : ${not_a_string[@]}"
echo "Tableau yet_not_a_string : ${yet_not_a_string[@]}"

J'aime beaucoup, mais ça correspond pas complètement à la demande formulée

PowaBanga a écrit :

Je voudrais pouvoir récupérer les valeur voulue à la sortie d'un `cat` sur le fichier combiné avec des `| grep` `|sed` `|cut` ou autre

Mais ça fonctionne parfaitement ;p

$ cat monfichier 
not_a_string=('do' 'not' 'return' 'this')
    string=(
'here' 'are' 'some' 'strings' 'to' 'return'
)
yet_not_a_string=(
'not'
'return'
'this'
'too'
)
$ source monfichier 
$ echo ${string[@]}
here are some strings to return
$ echo ${not_a_string[@]}
do not return this
$ echo ${yet_not_a_string[@]}
not return this too
$

Utilisations des balises de mises en formes.

Hors ligne

#8 Le 24/10/2022, à 11:11

Tawal

Re : [Bash] retourner la valeur entre deux caractères avec retours (Résolu)

Juste comme ça, mais :
cat ... | grep ... | sed ... est un UUOP (Useless Use Of Pipe).


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#9 Le 24/10/2022, à 11:46

matrix-bx

Re : [Bash] retourner la valeur entre deux caractères avec retours (Résolu)

Tawal a écrit :

Juste comme ça, mais :
cat ... | grep ... | sed ... est un UUOP (Useless Use Of Pipe).

Tout le monde a une certaine tendance à avoir du mal à se débarrasser de mauvaises habitudes prises lors de la découverte ou l'apprentissage des outils.
Ça m'a moi aussi pris un peu de temps pour passer de cat | grep | wc à grep -c big_smile


Utilisations des balises de mises en formes.

Hors ligne

#10 Le 25/10/2022, à 18:18

PowaBanga

Re : [Bash] retourner la valeur entre deux caractères avec retours (Résolu)

Alors pour la première méthode de matrix-bx, c'est vrai que j'avais pas pensé à remplacer le retour à la ligne, ça m'a donné pour des piste pour le résoudre de la façon dont je voulais le faire

tawai... je n'avais pas compris ton premier message à la première lecture... je n'avais pas du tout pensé imaginer à faire ça... Une pièce vient de tomber dans ma tête, je me sens à la fois bête et léger comme une plume.

Merci beaucoup !

Hors ligne

#11 Le 25/10/2022, à 19:32

Tawal

Re : [Bash] retourner la valeur entre deux caractères avec retours (Résolu)

Disons que c'est une astuce pour un cas particulier tongue


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#12 Le 30/10/2022, à 17:48

LeoMajor

Re : [Bash] retourner la valeur entre deux caractères avec retours (Résolu)

salut,
si tu supprimes "\n"

sed -z 's/\n//g; s/)/);/gp'   exemple.txt 

eval $(sed -z 's/\n//g; s/)/);/gp'  exemple.txt)
echo "${not_a_string[@]}" etc ...

Hors ligne

#13 Le 30/10/2022, à 18:54

Tawal

Re : [Bash] retourner la valeur entre deux caractères avec retours (Résolu)

eval is evil.
Comme dirait Watael : Welcome to sHell.

Dernière modification par Tawal (Le 30/10/2022, à 19:12)


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#14 Le 31/10/2022, à 15:58

LeoMajor

Re : [Bash] retourner la valeur entre deux caractères avec retours (Résolu)

A/ si tu supprimes "\n"

:~$ eval $(sed -zn 's/\n//g; s/)/);/gp'   example.txt)
:~$ echo -e "${not_a_string[@]}\n${string[@]}\n${yet_not_a_string[@]}"

B/ si tu gardes "\n"

:~$ cat  /tmp/multilines.awk
#/usr/bin/awk -f
/\(.*\)/ {match($0,/[(](.*)[)]/,t); print "1",t[1]}
/\(/ {sub(/.*[(]/,""); a=$0; while(!($0~/\)/)){getline; a=a$0}; gsub(/[)]/,"",a); print "2",a; a=""}
awk -f /tmp/multilines.awk exemple.txt
1 'do' 'not' 'return' 'this'
2 'do' 'not' 'return' 'this'
2 'here' 'are' 'some' 'strings' 'to' 'return'
2 'not''return''this''too' 

tu as aussi /debut/,/fin/   capture multi-lines sous sed/awk/..., mais cela suppose que le découpage soit régulier.

Hors ligne