2 votes

Bash : diviser sur le délimiteur mais garder le délimiteur

Je voudrais diviser une chaîne en un tableau en utilisant des délimiteurs et conserver ces délimiteurs. J'ai essayé d'utiliser IFS mais il supprime les délimiteurs.

Par exemple :

ligne="this.is/just(an]example"
IFS='}|//|)|(| |{|[|]|.|;|/"|,' read -ra ADDR <<< "$ligne"
for i in "${ADDR[@]}"; do
   echo $i
done

Je veux que le résultat soit comme ça :

this
.
is
/
just
(
an
]
example

Merci pour votre aide !

2voto

anubhava Points 172509

Vous pouvez utiliser grep avec -o option :

grep -oE '[^][^./(){};:,"]+|[][^./(){};:,"]' <<< "$ligne"

this
.
is
/
just
(
an
]
example

La Regex utilisée est basée sur l'alternance avec 2 alternances :

  • [^][^./(){};:,"]+ : Correspondance 1+ de n'importe quel caractère qui n'est pas dans la classe de caractères.
  • | : OU
  • [][^./(){};:,"] : Correspond à tout caractère qui se trouve dans la classe de caractères

0voto

tripleee Points 28746

Il n'y a pas de solution triviale à cela avec les buildins Bash pour autant que je sache, mais si c'est ce dont vous avez besoin, vous pouvez faire quelque chose comme ceci.

ligne="this.is/just(an]example"
array=()
while true; do
    for delim in '}' '//' ')' '(' ' ' '{' '[' ']' '.' ';' '/"' ','; do
        frag=${ligne#*"$delim"}
        [ "$frag" = "$ligne" ] || break
    done
    [ "$frag = "$ligne" ] && break
    head=${ligne%"$frag"}
    array+=("${head%"$delim"}" "$delim")
    ligne=$frag
done

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X