Bash: разделить на разделитель, но оставить разделитель - PullRequest
0 голосов
/ 21 сентября 2018

Я хотел бы разбить строку на массив, используя разделители, и оставить эти разделители.Я пытался использовать 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 ]

0 голосов
/ 21 сентября 2018

Насколько я знаю, нет тривиального решения этой проблемы с помощью встроенных команд Bash, но если это то, что вам нужно, вы можете сделать что-то подобное.

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
0 голосов
/ 21 сентября 2018

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

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

this
.
is
/
just
(
an
]
example

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

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