Bash:拆分分隔符但保留分隔符

Bash: split on delimiter but keep the delimiter

我想使用定界符将字符串拆分为数组并保留这些定界符。 我尝试使用 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

感谢您的帮助!

您可以使用 grep-o 选项:

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

this
.
is
/
just
(
an
]
example

正在使用的正则表达式是基于 2 个交替的交替:

  • [^][^./(){};:,"]+:匹配1+个不在字符class
  • 中的任意字符
  • |: 或
  • [][^./(){};:,"]:匹配字符class
  • 中的任意字符

据我所知,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