将 grep 的匹配项保存为数组

use*_*682 3 grep

我有一个包含以下内容的文件:

FILETYPE=A:B:C:D
Run Code Online (Sandbox Code Playgroud)

我怎样才能grep出来ABCD,并将它们保存在Linux上的ksh脚本的阵列?我试过

FILETYPES=`grep "FILETYPE" ${CONF_FILE} | awk -F: '{print $NF}'`
Run Code Online (Sandbox Code Playgroud)

但这只能得到最后一个。

ter*_*don 5

在 GNU/Linux 上,使用 ksh93 或 mksh(或zsh的 ksh 模拟模式),您可以执行以下操作:

set -o noglob
filetypes=( $(grep -Po 'FILETYPE=\K.*' < "$CONF_FILE" | tr ':' ' ') )
Run Code Online (Sandbox Code Playgroud)

(假设默认值为$IFS

或者,更惯用的方式:

set -o noglob
IFS=:
filetypes=( $(grep -Po 'FILETYPE=\K.*' < "$CONF_FILE"))
Run Code Online (Sandbox Code Playgroud)

请注意,我使用小写字母作为数组名称,这通常更安全,因为环境变量通常大写。将命令的输出保存为数组的方法是:

array=( $(command) )
Run Code Online (Sandbox Code Playgroud)

在禁用 glob 并设置字段分隔符之后。

然后,命令本身是grep(这里假设 GNUgrep或兼容 Perl Compatible Regular Expressions 支持已启用 ( -P)),这些给了我们\K这意味着“丢弃任何匹配到这一点的东西”。仅打印行的匹配部分的-o原因grep,并与 结合\K,使其仅A:B:C:D在此处打印。最后,用空格tr替换:恰好在默认值中的$IFS

$ printf '%s\n' "${filetypes[0]}"
A
$ printf '%s\n' "${filetypes[3]}" 
D
Run Code Online (Sandbox Code Playgroud)