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 30/01/2020, à 23:13

Spyki

[RESOLU] Besoin d'aide concernant l'utilisation de sed

Hello tout le monde, je bute sur un problème dont j'arrive pas à me dépêtrer car jsuis pas doué avec la commande sed (qui je sais devrais faire mon bonheur), enfin bref je commence à manquer de temps car d'habitude je me serais un peu plus acharner sur le problème donc j'espère que vous pourrez m'aider smile

Le problème est assez simple, je voudrais créer me créer 2 variables en faisant la bonne découpe d'un fichier de ce type :

[azerty1.2.3]
xxxxxxxxxxxxxxxxxxxxxx
xxx
xxxxx
[qwerty5.2.3]
xxxxxxx
xxxxxxxxx
xxxxx
[blabla999.44.222]
xxxx
xxxxx

Je voudrais du coup avec la commande sed stocker toutes les variables qui sont dans les crochets pour :
Stocker dans la premier variable (azerty   qwerty    blabla)
Stocker dans la seconde variable (1.2.3    5.2.3   999.44.22)

Bien évidemment avant cette commande je fais un "echo monfichier".

J'espère que mon problème est simple, merci d'avance pour votre aide smile

EDIT : MERCI KAMARIS smile

Dernière modification par Spyki (Le 03/02/2020, à 00:22)

Hors ligne

#2 Le 30/01/2020, à 23:31

Watael

Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed

salut,

Bien évidemment avant cette commande je fais un "echo monfichier".

pourquoi ?

Stocker dans la premier variable (azerty   qwerty    blabla)
Stocker dans la seconde variable (1.2.3    5.2.3   999.44.22)

quels sont les critères d'identification d'une partie par rapport à l'autre.

stocker dans des variables (shell ?), qui auront quelles formes ?


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

En ligne

#3 Le 30/01/2020, à 23:38

Spyki

Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed

Merci pour ta réponse rapide, j'ai eu le temps de décomplexifier mon fichier où je dois chopper mes variables

Ce qui donne visuellement plutôt ça maintenant :

azerty1.2.3
qwerty5.2.3
blabla999.44.22 

Les critères pour identifier ca serait quelque chose comme ça :

Variable 1 : tout le texte (sans les chiffres à droite)
Variable 2 : tous les chiffres . tous les chiffres . tous les chiffres (sans le texte à gauche)

J'espère que j'ai bien répondu à ta question

Dernière modification par Spyki (Le 30/01/2020, à 23:39)

Hors ligne

#4 Le 30/01/2020, à 23:52

kamaris

Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed

Tu peux faire ça en bash, en repartant de ton premier exemple :

while IFS='' read -r line; do
  if [[ $line =~ ^\[.*\]$ ]]; then
    line=${line:1:-1}
    a+=("${line%%[0-9]*}")
    b+=("${line##*[a-zA-Z]}")
  fi
done < tonFichier

Le tableau a contient le texte, le tableau b contient les chiffres :

$ echo "${a[*]}"
azerty qwerty blabla
$ echo "${b[*]}"
1.2.3 5.2.3 999.44.222
$ 

Hors ligne

#5 Le 30/01/2020, à 23:55

Spyki

Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed

Je vais tester ta solution et l'adapter, jte tiens au jus smile

Hors ligne

#6 Le 31/01/2020, à 00:11

Watael

Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed

dans le même esprit :

rgx='([a-Z]+)([0-9.]+)'
while read line; do [[ $line =~ $rgx ]]; a+=("${BASH_REMATCH[1]}"); b+=("${BASH_REMATCH[2]}" ); done <fichier

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

En ligne

#7 Le 31/01/2020, à 00:15

Spyki

Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed

Désolé jvous donne une autre info un peu tardivement mais je peux pas faire le :

done <mesfichiers*.conf

Ca me met un message comme quoi y'a une redirection ambiguë (mon but est de cibler plusieurs fichiers similaires)

Dernière modification par Spyki (Le 31/01/2020, à 00:16)

Hors ligne

#8 Le 31/01/2020, à 00:19

Watael

Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed

alors, il faut boucler sur chaque fichier.


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

En ligne

#9 Le 31/01/2020, à 00:31

Spyki

Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed

Si ça vous intéresse je vous donne le code que j'ai commencé à écrire, ça sera plus simple pour savoir de quoi on parle :

#!/bin/bash
	for fichier in `ls /etc/mesfichiers-*.conf`
	do
		for section in `grep '\[.*\]' $fichier | sed 's/\[\(.*\)\]/\1/g'`
		do
		VAR1 = `echo $fichier | sed xxxxx `
		VAR2 = `echo $section | sed xxxxxxxxx`
		VAR3 = `echo $section | sed xxxxxxxxxx`
                
                echo "$VAR1 $VAR2 $VAR3"
		done
	done

C'était un travail que j'avais déjà réussi avec sed mais ça remonte à pas mal de temps, ce qui nous intéresse dans notre exemple c'est de bien mettre dans la variable 2 (VAR2) le texte et dans la variable 3 (VAR3) les chiffres avec les points

Hors ligne

#10 Le 31/01/2020, à 00:33

kamaris

Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed

Sympa le BASH_REMATCH, ça permet de simplifier pas mal de choses, niveau écriture comme niveau calculs smile
Je remets ce que j'ai donné plus haut en l'incorporant du coup :

while IFS='' read -r line; do
  if [[ $line =~ ^\[([a-Z]+)([0-9.]+)\]$ ]]; then
    a+=("${BASH_REMATCH[1]}")
    b+=("${BASH_REMATCH[2]}")
  fi
done < tonFichier

@Spyki : si tu te moques de quel fichier proviennent tes données, tu peux aussi les concaténer et envoyer le tout dans la boucle while :

done < <(cat mesfichiers*.conf)

Hors ligne

#11 Le 31/01/2020, à 00:34

Watael

Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed

Aaaah.
pas ls !
pas grep|sed !
pas d'espaces autour du égal.

on te donne un code propre, il n'y a qu'à boucler autour, et tu en fais ça !? pouah.

Dernière modification par Watael (Le 31/01/2020, à 00:34)


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

En ligne

#12 Le 31/01/2020, à 00:36

cqfd93

Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed

Modération

Ça serait bien de mettre un titre entièrement en français…


cqfd93

Hors ligne

#13 Le 31/01/2020, à 00:38

Spyki

Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed

Watael a écrit :

Aaaah.
pas ls !
pas grep|sed !
pas d'espaces autour du égal.

on te donne un code propre, il n'y a qu'à boucler autour, et tu en fais ça !? pouah.

Naaan pas du tout, c'est ce que j'avais fait avant la discussion et je galérais tongue

Hors ligne

#14 Le 31/01/2020, à 00:45

Watael

Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed

ouf, je respire. smile


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

En ligne

#15 Le 31/01/2020, à 00:59

Spyki

Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed

En tout cas tout fonctionne super bien.

Petit question à la con étant donné qu'on est si bien lancé et que ça marche si bien.

Je voudrais alimenter ma troisième variable avec le même principe toujours avec les crochets :

[aaa bbb111.222.333]
[aaa ccc648.5.7]

etc...
sur autre un fichier ça ressemblerait du coup à :

[bbb yyyyy111.222.333]
[bbb zzzz648.5.7]

(nouvelle variable à la découpe)
VAR 1 : le texte de gauche seulement et s’arrête quand il voit un espace
VAR 2 : le texte du milieu (sans le texte de gauche et les chiffres de droite)
VAR 3 : les chiffres de droite avec les points sans les textes de gauche

En tout cas, vous gérez grave c'est cool smile

Dernière modification par Spyki (Le 31/01/2020, à 01:00)

Hors ligne

#16 Le 31/01/2020, à 02:11

kamaris

Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed

Là c'est juste une petite adaptation de l'expression régulière (avec un élément de BASH_REMATCH en plus ensuite pour la troisième variable) :

^\[([a-Z]+)\ ([a-Z]+)([0-9.]+)\]$

Hors ligne

#17 Le 31/01/2020, à 09:24

Spyki

Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed

Parfait, je viens à me demander, à quoi sert sed au juste ? tongue

Problème résolu en tout cas smile

Dernière modification par Spyki (Le 31/01/2020, à 09:25)

Hors ligne

#18 Le 31/01/2020, à 14:08

kamaris

Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed

sed sert à manipuler des flux.
Il est beaucoup plus puissant et rapide que bash pour ça, mais lorsqu'il s'agit d'extraire simplement quelques données à dispatcher dans des variables, ça n'est pas forcément le plus pratique, et on peut au moins s'en passer.

Ceci dit, si tes fichiers de données commencent à être un peu gros, sed se montrera vite plus rapide.
Pour ton dernier exemple de format de données, tu peux par exemple essayer de comparer, pour remplir le tableau a, la méthode full bash donnée plus haut, avec ça :

mapfile -t a < <(sed -nE 's/^\[([a-zA-Z]+) ([a-zA-Z]+)([0-9.]+)\]$/\1/p')

Selon le nombre de tableaux à remplir et la taille du fichier d'entrée, sed prendra plus ou moins vite l'avantage, mais il finira par le prendre.

Hors ligne

#19 Le 31/01/2020, à 14:55

Watael

Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed

ou on passe à awk, qui allie la manipulation des regex et la simplicité/lisibilité d'un langage de haut niveau comme le shell;
parce que lire un script sed... roll

Dernière modification par Watael (Le 31/01/2020, à 14:56)


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

En ligne

#20 Le 01/02/2020, à 19:04

Spyki

Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed

Zut j'ai pas vu mais y'a un soucis dans ce que vous m'avez donner pour stocker les variables

Dans la première boucle tout se passe bien mais dans la seconde boucle, il garde en mémoire ce qu'il y avait marqué dans la première et ainsi de suite pour la troisième puis quatrième.

Vous avez des solutions ?

Exemple :

1ère variable après 1 ère bouche après un echo dessus :

bbb

après une 2 ème boucle :

bbb bbb

après une 3 ème boucle :

bbb bbb bbb

etc...

Dernière modification par Spyki (Le 01/02/2020, à 19:30)

Hors ligne

#21 Le 01/02/2020, à 20:08

kamaris

Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed

Il faut que tu réinitialises les tableaux avant la boucle while :

unset a b c

Hors ligne

#22 Le 01/02/2020, à 20:23

Spyki

Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed

Parfait big_smile

Hors ligne

#23 Le 01/02/2020, à 22:28

Spyki

Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed

J'ai encore réarranger mon fichier pour que cela fasse plus propre de cette manière :

Sur mon fichier où je récupère ressemble à ça désormais :

#bbb 111.222.333#
xxxxx
xxxx
xxxxxx
[yyyyzzzz]

Le truc maintenant c'est que j'arrive bien à attraper les 2 premières variables qui sont entre # et en ajustant les commandes ci-dessus mais je n'arrive pas à prendre la 3ème variable qui est entre crochet [yyyzzzz]

Ca va faire 1 heure que je m'acharne à faire un "&&" ou un "and" et j'arrive pas à comprendre comment prendre cette 3ème variable sad

Si vous pouviez m'aider, ça serait cool smile

Dernière modification par Spyki (Le 01/02/2020, à 22:29)

Hors ligne

#24 Le 01/02/2020, à 23:04

kamaris

Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed

Tu peux décomposer les cas comme ça :

if [[ $line =~ ^\#([a-Z]+)\ ([0-9.]+)\#$ ]]; then
  a+=("${BASH_REMATCH[1]}")
  b+=("${BASH_REMATCH[2]}")
elif [[ $line =~ ^\[[a-Z]+\]$ ]]; then
  c+=("${line:1:-1}")
fi

Hors ligne

#25 Le 01/02/2020, à 23:13

Spyki

Re : [RESOLU] Besoin d'aide concernant l'utilisation de sed

aaah ok j'avais aussi tester le elif mais ça marchait pas également tongue

Je teste tout ça, merci que tu sois au aussi réactif smile

Dernière modification par Spyki (Le 01/02/2020, à 23:14)

Hors ligne