如何通过分隔符拆分字符串导致未知数量的部分,以及如何将结果收集到数组中?

von*_*otz 2 bash array bash-array

我需要处理一些包含路径的字符串。如何将这样的字符串拆分/为分隔符,导致路径部分数量未知,最后我如何提取生成的路径部分?

cut显然不是首选工具,因为它需要您事先知道零件的数量,而且它也不会输出每个零件以便我可以使用readarraymapfile将它们收集到数组中。

Sté*_*las 5

在 中bash,对于单字符分隔符,您可以在禁用 glob 部分后使用 split+glob 运算符(在列表上下文中不加引号的扩展):

string='foo/bar
baz/asd..'

IFS=/
set -o noglob
array=( $string )
Run Code Online (Sandbox Code Playgroud)

请注意,它仅拆分string='/foo/'""and "foo"(与拆分 时相同string='/foo'。要拆分为"","foo""",您可以执行以下操作:

IFS=/
set -o noglob
array=( $string'' )
Run Code Online (Sandbox Code Playgroud)

虽然然后分裂string=''成一个空元素而不是零元素。

zsh(除非在sh/ksh仿真中,否则不会在未加引号的扩展上执行 split+glob ),您可以使用s不限于单字符分隔符的参数扩展标志:

array=( ${(s[/])string} )
Run Code Online (Sandbox Code Playgroud)

删除空元素,或:

array=( "${(@s[/])string}" )
Run Code Online (Sandbox Code Playgroud)

保留空元素。/foo/然后被拆分为"","foo""",并将空字符串拆分为零元素。

您可以拆分存储在变量中的分隔符:

array=( "${(@ps[$delimiter])string}" )
Run Code Online (Sandbox Code Playgroud)

p标志还允许您输入转义序列,例如\0, \n,尽管这两个具有快捷标志:f在换行符0上拆分,在 NUL 上拆分(用于拆分find -print0, grep -lZ, sort -z... 等的输出files=( ${(0)"$(grep -lZ pattern -- *)"} ))。

在 中zsh,您还可以使用给定的单个字节作为分隔符将数组变量绑定到标量变量。$pathinzsh实际上是一个特殊的数组,它以这种方式$PATH:as 分隔符相关联(灵感来自csh)。您可以对任何变量执行此操作,例如:

typeset -T string array /
Run Code Online (Sandbox Code Playgroud)

/-separated绑定$string$array数组。