经过大量的反复试验,我实际上发现 bash 上最好、最清晰和最简单的多维数组是使用常规 var。是的。
优点:您不必循环遍历一个大数组,您只需 echo "$var" 并使用 grep/awk/sed。它简单明了,您可以拥有任意数量的列。
例子:
$ var=$(echo -e 'kris hansen oslo\nthomas jonson peru\nbibi abu johnsonville\njohnny lipp peru')
$ echo "$var"
kris hansen oslo
thomas johnson peru
bibi abu johnsonville
johnny lipp peru
如果你想在秘鲁找到每个人
$ echo "$var" | grep peru
thomas johnson peru
johnny lipp peru
第三个字段中只有 grep(sed)
$ echo "$var" | sed -n -E '/(.+) (.+) peru/p'
thomas johnson peru
johnny lipp peru
如果你只想要 x 字段
$ echo "$var" | awk '{print $2}'
hansen
johnson
abu
johnny
秘鲁每个叫 thomas 的人都返回他的姓氏
$ echo "$var" |grep peru|grep thomas|awk '{print $2}'
johnson
您能想到的任何查询...超级简单。
要更改项目:
$ var=$(echo "$var"|sed "s/thomas/pete/")
删除包含“x”的行
$ var=$(echo "$var"|sed "/thomas/d")
根据另一个项目的值更改同一行中的另一个字段
$ var=$(echo "$var"|sed -E "s/(thomas) (.+) (.+)/\1 test \3/")
$ echo "$var"
kris hansen oslo
thomas test peru
bibi abu johnsonville
johnny lipp peru
当然,如果您想这样做,循环也可以
$ for i in "$var"; do echo "$i"; done
kris hansen oslo
thomas jonson peru
bibi abu johnsonville
johnny lipp peru
发现的唯一问题是您必须始终引用 var(在示例中;var 和 i),否则事情将如下所示
$ for i in "$var"; do echo $i; done
kris hansen oslo thomas jonson peru bibi abu johnsonville johnny lipp peru
毫无疑问,有人会说如果您的输入中有空格,它将无法正常工作,但是可以通过在输入中使用另一个分隔符来解决此问题,例如(现在使用 utf8 字符来强调您可以选择输入不会选择的内容包含,但你可以选择任何ofc):
$ var=$(echo -e 'field one☥field two hello☥field three yes moin\nfield 1☥field 2☥field 3 dsdds aq')
$ for i in "$var"; do echo "$i"; done
field one☥field two hello☥field three yes moin
field 1☥field 2☥field 3 dsdds aq
$ echo "$var" | awk -F '☥' '{print $3}'
field three yes moin
field 3 dsdds aq
$ var=$(echo "$var"|sed -E "s/(field one)☥(.+)☥(.+)/\1☥test☥\3/")
$ echo "$var"
field one☥test☥field three yes moin
field 1☥field 2☥field 3 dsdds aq
如果您想在输入中存储换行符,您可以在输入之前将换行符转换为其他内容,然后在输出中再次将其转换回(或不使用 bash ...)。享受!