经过大量试验和错误,我实际上发现 bash 上最好、最清晰和最简单的多维数组是使用常规 var。是的。
优点:你不必遍历一个大数组,你可以直接回显 "$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...)。尽情享受吧!