假设我有一个 bash 数组
X=("a" "b c" "-d" "k j", "-f")
Run Code Online (Sandbox Code Playgroud)
我想是否与开始过滤"-",并得到
("a" "b c" "k j")和("-d" "-f")分别。
我怎样才能做到这一点?
我认为你必须遍历数组:
$ X=("a" "b c" "-d" "k j", "-f")
$ for elem in "${X[@]}"; do [[ $elem == -* ]] && with+=("$elem") || without+=("$elem"); done
$ printf "%s\n" "${with[@]}"
-d
-f
$ printf "%s\n" "${without[@]}"
a
b c
k j,
Run Code Online (Sandbox Code Playgroud)
从类似问题的答案中,您可以这样做:
A=$((IFS=$'\n' && echo "${X[*]}") | grep '^-')
B=$((IFS=$'\n' && echo "${X[*]}") | grep -v '^-')
Run Code Online (Sandbox Code Playgroud)
从那个答案来看:
这里的重点是 IFS=$'\n' 导致“${MY_ARR[*]}”使用分隔项目的换行符进行扩展,因此可以通过 grep 进行管道传输。特别是,这将处理嵌入数组项内的空格。
然后我们使用grep/grep -v过滤入/出与模式匹配的元素