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 ответа:
Вы можете использовать
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