Bash: разделить на разделитель, но сохранить разделитель


Я хотел бы разделить строку на массив с помощью разделителей и сохранить эти разделители. Я пробовал использовать IFS, но он перекрывает разделители.

Например:

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

Я хочу, чтобы результат был таким:

this
.
is
/
just
(
an
]
example

Спасибо за помощь!

2 2

2 ответа:

Вы можете использовать grep с опцией -o:

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

this
.
is
/
just
(
an
]
example

Используемое регулярное выражение основано на чередовании с 2 чередованиями:

  • [^][^./(){};:,"]+: соответствует 1+ любого символа, который не входит в класс символов
  • |: или
  • [][^./(){};:,"]: соответствует любому символу, который находится в классе символов

Насколько я знаю, нет никакого тривиального решения для этого с bash builtins, но если это то, что вам нужно, вы можете сделать что-то вроде этого.

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