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 09/02/2013, à 12:53

adr2

sed découpage chaîne et stockage dans des variables

Bonjour,

Je cherche à découper des chaînes en plusieurs morceaux et stocker le résultat dans des variables.

Ce code fonctionne :

i='abc123def456'
IFS=:
read a b c d < <(
echo "$i" | sed -r 's/^([^0-9]{1,})([0-9]{1,})([^0-9]{1,})([0-9]{1,})$/\1:\2:\3:\4/'
)
echo "$a"
echo "$b"
echo "$c"
echo "$d"

mais il y a un caractère "interdit" (":"), je cherche donc une solution sans caractère "interdit".

Merci d'avance pour vos réponses

Hors ligne

#2 Le 09/02/2013, à 15:03

Maisondouf

Re : sed découpage chaîne et stockage dans des variables

Avec une boucle:

#! /bin/sh

i='abc123def456'
n=0
a=""
while [ "$i" != "" ];
do

   p=`echo $i | cut -c 1`
   i=`echo $i | cut -c 2-`
#   echo $p

   t=`echo "0123456789" | grep $p`
   if [ "$t" != "" ];
   then
       if [ "$n" != "0" ];
       then
          a=`echo $a$p`
          continue;
       else
          echo $a
          a=$p
          n=1
          continue;
       fi
   else
       if [ "$n" != "0" ];
       then
          echo $a
          a=$p
          n=0
          continue;
       else
          a=`echo $a$p`
          continue;
       fi
   fi
done

echo $a

ASUS M5A88-v EVO avec AMD FX(tm)-8120 Eight-Core Processor,  OS principal Precise 12.04.1 LTS 63bits½
Bricoleur, menteur, inculte, inadapté social et mythomane, enfin d'après certains....
"the secret of my form is summed up in two words, no sport" (Winston Churchill)

Hors ligne

#3 Le 09/02/2013, à 15:44

Hizoka

Re : sed découpage chaîne et stockage dans des variables

et si tu ne change pas l'IFS ?
ca marcherait...

i='abc123def456'
read a b c d < <( sed -r 's/^([^0-9]{1,})([0-9]{1,})([^0-9]{1,})([0-9]{1,})$/\1 \2 \3 \4/' <<< "$i")

tes chaines sont-elles toujours de 3 caracteres ?
tes chaines sont elles toujours a separer en 4 ?

i='abc123def456'
a=${i:3:3}
b=${i:6:3}
c=${i:9:3}
d=${i:12:3}

PS : tu peux remplacer

echo "$i" | sed -r 's/^([^0-9]{1,})([0-9]{1,})([^0-9]{1,})([0-9]{1,})$/\1:\2:\3:\4/'

par

sed -r 's/^([^0-9]{1,})([0-9]{1,})([^0-9]{1,})([0-9]{1,})$/\1:\2:\3:\4/' <<< "$i"

et en full bash :

i='abc123def456'
a=${i%%[1-9]*}
i=${i/#${a}}
b=${i%%[a-zA-Z]*}
i=${i/#${b}}
c=${i%%[1-9]*}
d=${i/#${c}}

Dernière modification par Hizoka (Le 09/02/2013, à 15:55)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#4 Le 09/02/2013, à 21:03

adr2

Re : sed découpage chaîne et stockage dans des variables

Hizoka a écrit :

et si tu ne change pas l'IFS ?
ca marcherait...

i='abc123def456'
read a b c d < <( sed -r 's/^([^0-9]{1,})([0-9]{1,})([^0-9]{1,})([0-9]{1,})$/\1 \2 \3 \4/' <<< "$i")

Non, dans ce cas là c'est l'espace qui devient interdit.

Hizoka a écrit :

tes chaines sont-elles toujours de 3 caracteres ?
tes chaines sont elles toujours a separer en 4 ?

Non, je cherche une solution générique où c'est l'expression régulière qui détermine le découpage.

Hors ligne

#5 Le 09/02/2013, à 21:06

Hizoka

Re : sed découpage chaîne et stockage dans des variables

bah oui mais comment sais tu ou il faut couper alors ?

c'est au changement entre lettre et chiffre ?
si oui le fullbash devrait aller car pas de caractere interdit et il recherche a chaque fois le passage de chiffre a lettre

Si tu ne veux pas de caracter interdit, comment sais tu ou il faut couper ?!
il faudrait que tu donnes d'autres exemples pour i
Si ce n'est pas avec le nombre de caractere a couper ni de caractere separateur...

Sinon en detournant le truc :

# Variable de base
i='abc123def456'

# Insertion de @@@ entre les chiffres et les lettres
i=$(sed -r 's/^([^0-9]{1,})([0-9]{1,})([^0-9]{1,})([0-9]{1,})$/\1@@@\2@@@\3@@@\4/' <<< "$i")

# Creation d'un tableau contenant chaque partie
while read; do tableau+=("${REPLY}"); done <<< "${i//@@@/$'\n'}"

# Verification
echo "${tableau[0]}"
echo "${tableau[1]}"
echo "${tableau[2]}"

Dernière modification par Hizoka (Le 09/02/2013, à 21:24)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#6 Le 10/02/2013, à 00:25

adr2

Re : sed découpage chaîne et stockage dans des variables

Un script avec

sed -r 's/^([^0-9]{1,})([0-9]{1,})([^0-9]{1,})([0-9]{1,})$/\1\n\2\n\3\n\4/' <<< "$i"

pourrait fonctionner mais je n'arrive pas à stocker les lignes dans des variables ou un tableau.

Avec :

ISF=$'\n'
i='a-_ %bc123d$e£f456' # contient une espace
j=1
for k in $(sed -r 's/^([^0-9]{1,})([0-9]{1,})([^0-9]{1,})([0-9]{1,})$/\1\n\2\n\3\n\4/' <<< "$i")
do
    a["$j"]="$k"
    ((j++))
done

j'obtiens :

a[1]="a-_"
a[2]="%bc"
a[3]="123"
a[4]="d$e£f"

alors que je voudrais obtenir :

a[1]="a-_ %bc"
a[2]="123"
a[3]="d$e£f"
a[4]="456"

==================================================================

Je rappelle que je cherche une solution "générique" c'est-à-dire un script facilement adaptable à un problème donné. Par exemple, l'expression régulière pourrait être :

s/^([^@]{1,})@(.{1,})\.([^.]{1,})$/\1\n\2\n\3/

pour décomposer une adresse mail.

 azerty.uiop@qsdf.exemple.fr 

donnerait :

azerty.uiop
qsdf.exemple
fr

Hors ligne

#7 Le 10/02/2013, à 00:50

Watael

Re : sed découpage chaîne et stockage dans des variables

Je rappelle que je cherche une solution "générique" c'est-à-dire un script facilement adaptable à un problème donné.

c'est contradictoire !

et c'est:  I F S
non:  I S F.


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

Hors ligne

#8 Le 10/02/2013, à 01:02

Hizoka

Re : sed découpage chaîne et stockage dans des variables

hizoka a écrit :

tableau+=("....")

alors t'embete pas avec ton :

j=1
a["$j"]="$k"
((j++))

je vois pas comment te donner une reponse generic avec ce que tu demandes....

il faut obligatoirement donner des bases...
ex : séparer les chiffres des lettres

Voila une possibilité tongue

# Variable a traiter
i='a-_ %bc123d$e£f456'

# Destruction de variable qui pourrait foutre le bordel
unset var_post_traitement caract old_caract tableau

# Boucle qui traite les caracteres un a un
for (( x=0; x<${#i}; x++ ))
do
  # Teste le type de caractere
  case ${i:${x}:1} in
    [a-zA-Z]) caract="lettre" ;;
    [0-9]) caract="chiffre" ;;
    *) caract=${old_caract}  ;;
  esac

  # Creer un old_caract identique a caract s'il n'existe pas, 
  # Sii pas cette ligne alors le if coincera toujours a la 1ere condition
  [[ -z ${old_caract} ]] && old_caract=${caract}

  # Compare le type du nouveau caractere avec l'ancien
  if [[ ${caract} == ${old_caract} || -z ${var_post_traitement} ]]
  then
    # C'est le meme type, il suffit de donner le caractere
    var_post_traitement+="${i:${x}:1}"

  else
    # Les types sont differents, du coup on ajoute le separateur maison @@@
    var_post_traitement+="@@@${i:${x}:1}"

    # on change le type de caractere
    old_caract=${caract}
  fi
done

# Creation d'un tableau utilisant le separateur maison @@@ pour sectionner la variable
while read; do tableau+=("${REPLY}"); done <<< "${var_post_traitement//@@@/$'\n'}"

# Verification
for (( x=0; x<${#tableau[@]}; x++ )); do echo "${tableau[${x}]}"; done

marche avec :

i='a-_ %*pbc12 <3d$e£f4 56'
i='a-_ %*pb.c1.2 <-3d$e+£f4 56'
i='+1a-_ %*pb.c1.2 <-3d$e+£f4 56'
i='+1a-_ %*pb.c1.2 <-3d$e+£f4 56cac40-+ù%5ppp'

Dans le cas de : 40-+ù, il renvera 40-+ puis ù, il ne pourra pas renvoyer 40 puis -+ù

enfin tout ce beau code ne marche que si tu separe ta variable a chaque changement lettre-chiffre.

Sinon en modifiant *) caract=${old_caract}  ;; en *) caract=autre  ;; , on peut separer egalement les caracteres autres

Dernière modification par Hizoka (Le 10/02/2013, à 01:19)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#9 Le 10/02/2013, à 01:25

nesthib

Re : sed découpage chaîne et stockage dans des variables

i='a-_ %bc123d$e£f456'
eval a=(  $(sed 's/[[:digit:]]\+\|[^[:digit:]]\+/"&" /g' <<<$i) )
echo ${a[0]}
echo ${a[1]}
echo ${a[2]}
echo ${a[3]}

et si les guillemets doubles « " » doivent aussi être prises en compte :

i='a-_ %bc12"3d$e£"f456'
eval a=(  $(sed -e 's/"/\\"/g' -e 's/[[:digit:]]\+\|[^[:digit:]]\+/"&" /g' <<<$i) )

pas besoin de faire des scripts compliqués de dizaines de lignes tongue


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#10 Le 10/02/2013, à 01:43

Watael

Re : sed découpage chaîne et stockage dans des variables

`eval' n'est pas justifié (comme s'il pouvait l'être).


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

Hors ligne

#11 Le 10/02/2013, à 02:12

Maisondouf

Re : sed découpage chaîne et stockage dans des variables

nesthib a écrit :

pas besoin de faire des scripts compliqués de dizaines de lignes

Ben moi, je pars du principe que plus il y a de lignes qui font chacune une petite chose simple, c'est beaucoup plus facile à comprendre et surtout à débuguer.
Surtout qu'aujourd'hui on tourne plus avec des 8086 à 4,7 Mhz  wink


ASUS M5A88-v EVO avec AMD FX(tm)-8120 Eight-Core Processor,  OS principal Precise 12.04.1 LTS 63bits½
Bricoleur, menteur, inculte, inadapté social et mythomane, enfin d'après certains....
"the secret of my form is summed up in two words, no sport" (Winston Churchill)

Hors ligne

#12 Le 10/02/2013, à 02:21

nesthib

Re : sed découpage chaîne et stockage dans des variables

Watael a écrit :

`eval' n'est pas justifié (comme s'il pouvait l'être).

Tu peux détailler ?

Maisondouf a écrit :

Ben moi, je pars du principe que plus il y a de lignes qui font chacune une petite chose simple, c'est beaucoup plus facile à comprendre et surtout à débuguer.

Donc une ligne faisant une chose simple c'est moins facile que 50 lignes faisant des choses simples ? tongue


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#13 Le 10/02/2013, à 02:31

Maisondouf

Re : sed découpage chaîne et stockage dans des variables

AH parce que tu crois que ça c'est simple

eval a=(  $(sed -e 's/"/\\"/g' -e 's/[[:digit:]]\+\|[^[:digit:]]\+/"&" /g' <<<$i) )

Pour moi c'est des hiéroglyphes lol


ASUS M5A88-v EVO avec AMD FX(tm)-8120 Eight-Core Processor,  OS principal Precise 12.04.1 LTS 63bits½
Bricoleur, menteur, inculte, inadapté social et mythomane, enfin d'après certains....
"the secret of my form is summed up in two words, no sport" (Winston Churchill)

Hors ligne

#14 Le 10/02/2013, à 02:59

nesthib

Re : sed découpage chaîne et stockage dans des variables

sed -e 's/"/\\"/g' -e 's/[[:digit:]]\+\|[^[:digit:]]\+/"&" /g' <<<$i

correspond à la contrainte de adr2, il a dit vouloir travailler avec des regex et pouvoir en changer (« Je cherche une solution générique où c'est l'expression régulière qui détermine le découpage. »).

Il reste donc :

eval a=( $(…) )

on fait pire tongue


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#15 Le 10/02/2013, à 08:17

Hizoka

Re : sed découpage chaîne et stockage dans des variables

Avec i='a-_ %*pbc12 <3d$e£f4 56'

nestib a écrit :

a-_ %*pbc
12
<
3
d£f
4

56

moi a écrit :

a-_ %*pbc
12 <3
d$e£f
4 56

avec i='+1a-_ %*pb.c1.2 <-3d$e+£f4 56cac40-+ù%5ppp'

nestib a écrit :

+
1
a-_ %*pb.c
1
.
2
<-
3
d+£f
4

56
cac
40
-+ù%
5
ppp

moi a écrit :

+1
a-_ %*pb.c
1.2 <-3
d$e+£f
4 56
cac
40-+
ù%
5
ppp

moi en separant les caracteres en 3 groupes a écrit :

+
1
a
-_ %*
pb
.
c
1
.
2
<-
3
d
$
e

f
4

56
cac
40
-+
ù
%
5
ppp

On a pas du tout les memes decoupages, meme si je decoupe au niveau des cracteres autre que numerique et alphabetique

par contre il est certain que c'est vachement plus court ta solution smile

nestib peux tu expliquer ta ligne sed stp.

Dernière modification par Hizoka (Le 10/02/2013, à 08:19)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#16 Le 10/02/2013, à 09:54

nesthib

Re : sed découpage chaîne et stockage dans des variables

Ma ligne sed sépare les groupes de chiffres et de non chiffres (suite de [[:digit:]] ou de non [[:digit:]]) en les substituant par eux-mêmes (&) entourés pas des guillemets doubles et suivi d'un espace ("&" ). Ça n'est qu'un exemple, ça n'est pas nécessairement ce que adr2 voulait faire, mais comme tu avais parlé de détecter le changement chiffres/lettres, voici une solution smile

un autre exemple qui sépare les groupe contigus de chiffres, lettres ou autres caractères :

i='a-_ %*pbc12 <3d$e£f4 56'
sed -e 's/"/\\"/g' -e 's/[[:digit:]]\+\|[[:alnum:]]\+\|[^[:digit:][:alnum:]]\+/"&" /g' <<<"$i"

GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#17 Le 10/02/2013, à 10:02

Hizoka

Re : sed découpage chaîne et stockage dans des variables

je comprends pas tout mais le & est pratique, il va falloir que je vois comment il marche vraiment car je ne connaissais pas tout.

[^[:digit:][:alnum:]] => je ne savais pas qu'on pouvait regrouper comme ça smile

EDIT : en effet c'est pas mal tout ça, pas facile au 1er abord, ca donne en francais :

s/[[:digit:]]\+\|[[:alnum:]]\+\|[^[:digit:][:alnum:]]\+/"&" /g

remplace les suites de chiffre ou les suites de lettre ou les suites de caracteres non chiffre/lettre par eux même entre guillemet et suivit d'un espace.

s => remplacement
[[:digit:]]\+ => suite de chiffre
\| : ou
[[:alnum:]]\+ : suite de lettre
\| : ou
[^[:digit:][:alnum:]]\+ : suite de cractere different de lettre ou chiffre
"&" => encadre la suite de " et fini avec un espace

Dernière modification par Hizoka (Le 10/02/2013, à 10:14)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#18 Le 10/02/2013, à 10:10

nesthib

Re : sed découpage chaîne et stockage dans des variables

[[:digit:]] → n'importe quel chiffre
[[:digit:]]\+ → n'importe quel chiffre, au moins une fois et le plus possible
a\|b → a OU b

l'opérateur g à la fin de la commande est pour répéter l'expression sur tous les groupes

donc la ligne est à lire comme « tous les groupes de un ou plus chiffres OU de une ou plus lettres OU de un ou plus caractères qui ne sont ni chiffres ni lettres »

le & ne fait que remplacer chaque motif trouvé (comme \1 ou \2 mais sans besoin de parenthèse et d'identifier les groupes)


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#19 Le 10/02/2013, à 10:15

Hizoka

Re : sed découpage chaîne et stockage dans des variables

oui je viens d'editer mon message smile

j'avais pas mal compris !

J'aurais appris de nouveau truc pratique pour sed !!

merci

EDIT : par contre je pige pas pourquoi ton exemple renvoie :

a
-_ %*
pbc12
 <
3d
$
e
£
f4
 
56

pourquoi pbc12 et 3d et f4 ?

c'est peut etres plus simple a comprendre ca :

sed -r 's/"/\"/g ; s/[[:digit:]]+|[[:alnum:]]+|[^[:digit:][:alnum:]]+/"&" /g' <<<"$i"

ca evite d'avoir les echappements pour le coup

Dernière modification par Hizoka (Le 10/02/2013, à 10:32)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#20 Le 10/02/2013, à 12:45

Watael

Re : sed découpage chaîne et stockage dans des variables

watael a écrit :

`eval' n'est pas justifié (comme s'il pouvait l'être).

nesthib a écrit :

Tu peux détailler ?

`eval' c'est mal. Et ici il ne sert à rien.
Tu assignes une substitution de commande à un tableau. Il n'y a aucune raison d'utiliser `eval'.

Que fait cette commande dans ton code selon toi ?


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

Hors ligne

#21 Le 10/02/2013, à 12:59

adr2

Re : sed découpage chaîne et stockage dans des variables

Watael a écrit :

et c'est:  I F S
non:  I S F.

hmm

IFS=$'\n'
i='a-_ %bc123d$e£f456' # contient une espace
j=1
for k in $(sed -r 's/^([^0-9]{1,})([0-9]{1,})([^0-9]{1,})([0-9]{1,})$/\1\n\2\n\3\n\4/' <<< "$i")
do
    a["$j"]="$k"
    ((j++))
done

=> mon script fonctionne comme je le souhaitais

Hizoka a écrit :
hizoka a écrit :

tableau+=("....")

alors t'embete pas avec ton :

j=1
a["$j"]="$k"
((j++))

=> amélioration :

IFS=$'\n'
i='a-_ %bc123d$e£f456' # contient une espace
for k in $(sed -r 's/^([^0-9]{1,})([0-9]{1,})([^0-9]{1,})([0-9]{1,})$/\1\n\2\n\3\n\4/' <<< "$i")
do
    a+=("$k")
done

Je vous donne un exemple d'adaptation pour le découpage d'URL :

IFS=$'\n'
i='http://forum.ubuntu-fr.org/viewtopic.php?id=1194001'
for k in $(sed -r 's#^([^:]{1,})://(.{1,})\.([^.]{1,})/(.*)$#\1\n\2\n\3\n\4#' <<< "$i")
do
    a+=("$k")
done

donne

a[0]="http"
a[1]="forum.ubuntu-fr"
a[2]="org"
a[3]="viewtopic.php?id=1194001"

Hors ligne

#22 Le 10/02/2013, à 18:15

nesthib

Re : sed découpage chaîne et stockage dans des variables

Watael a écrit :

`eval' c'est mal. Et ici il ne sert à rien.
Tu assignes une substitution de commande à un tableau. Il n'y a aucune raison d'utiliser `eval'.

Que fait cette commande dans ton code selon toi ?

Selon moi cette commande fait ce qu'on lui demande wink
eval n'a rien de mal, je ne sais pas d'où tu sors ça, c'est une primitive du shell, il suffit juste de savoir l'utiliser.

Je pense que tu manques un point important du fonctionnement du shell. Sans eval la commande

a=( $(…) )

ne fera pas l'interprétation des "abc" "123" comme des chaînes de caractères délimitées mais prendra en compte « " » comme un simple caractère (à cause de l'ordre des expansions dans bash) et les chaînes seront toujours séparées par… les espaces… même au sein de "ab c", ce qui donnera « "ab » et « c" ».
Avec eval le tableau est correctement crée car le shell prend en compte les guillemets comme encadrant les chaînes de caractères.

Si tu as une meilleure méthode, sans eval, qui prenne en compte les guillemets et les espaces dans la chaîne de caractères initiale (ex. «  ») et qui permette de séparer correctement les sous chaînes en les assignant dans un tableau… je t'écoute smile
J'attends aussi une explication un peu plus argumentée de la saymalitude de eval tongue

@Hizoka : oups, petite erreur, j'ai utilisé [[:alnum:]] au lieu de [[:alpha:]], voilà pourquoi wink

@adr2 : as-tu testé (et compris) ma solution ?


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#23 Le 10/02/2013, à 18:44

Watael

Re : sed découpage chaîne et stockage dans des variables

Je roule à 240 km/h, parce que le compteur de ma voiture peut aller jusqu'à cette vitesse.
Et c'est pas un problème : il suffit de savoir s'en servir. XD

Je considère meilleure n'importe quelle autre solution, qui n'implique pas `eval'.

i='a-_ %bc123d$e£f456'; OIFS="$IFS"; IFS="${IFS// /}"; a=( $(sed 's/[[:digit:]]\+\|[^[:digit:]]\+/&\n/g' <<<"$i") ); IFS="$OIFS"; printf '%s\n' "${a[@]}"
a-_ %bc
123
d$e£f
456

J'attends aussi une explication un peu plus argumentée de la saymalitude de eval

on en a déjà parlé l'an dernier. regarde dans les archives.


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

Hors ligne

#24 Le 10/02/2013, à 22:42

adr2

Re : sed découpage chaîne et stockage dans des variables

nesthib a écrit :

@adr2 : as-tu testé (et compris) ma solution ?

Ça fonctionne pour le premier exemple que j'ai donné mais ça ne permet pas de décomposer une URL par exemple, mais c'est un script intéressant qui peut être adapté pour parser du HTML :

i='<!DOCTYPE html>
<html>
    <head>
        <title>blabla</title>
    </head>
    <body>
        <h1>blabla</h1>
        <p>Lorem ipsum</p>
    </body>
</html>'
sed 's/<[^>]\+>\|[^<]\+/"&" /g' <<<$i

Hors ligne

#25 Le 11/02/2013, à 03:44

nesthib

Re : sed découpage chaîne et stockage dans des variables

@Watael : Ton analogie est fallacieuse… il ne suffit pas de comparer à quelque chose d'absurde pour rendre l'idée initiale fausse tongue

Sinon ta solution ne prend pas en compte le cas où « \n » est dans i, elle prendra « \n » comme un séparateur et non comme une partie de la chaîne (mais je t'accorde que tu peux rajouter des étapes pour contourner le problème, mais c'est pareil avec sed puisqu'il ne travaille que sur des lignes).

Pour les archives, désolé, je ne me souvenais pas et je n'ai pas retrouvé.

@adr2 : il suffit de changer l'expression rationnelle (pour quelque chose du genre : a=( $(sed 's/\([^@]\+\)@\([^@]\+\)\.\([^\.]\+\)/"\1" "\2" "\3"/' <<<"test.machin@mail.truc.com") )), mais dans un tel cas j'avoue que ça devient inutile puisqu'il y a rarement (!) des espaces dans une adresse mail (et une simple affectation de tableau sera suffisante).


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne