如何从zsh变量中提取模式的第n次出现?

如何从zsh变量中提取模式的第n次出现?,zsh,Zsh,我有一个用下划线分隔的变量,它编码不同的信息位,例如: my_variable="john_smith_cambridge_MA_65_male" 如果location应该是第三个和第四个字段的组合,我想我可以这样做 location=${(j._.)${${(s._.)my_variable}[3,4]}} echo $location # cambridge_MA 但我想知道是否有比拆分然后加入更简单的语法 编辑:经过一些研究,我发现我可以使用backreferences标志(#b) 尽

我有一个用下划线分隔的变量,它编码不同的信息位,例如:

my_variable="john_smith_cambridge_MA_65_male"
如果
location
应该是第三个和第四个字段的组合,我想我可以这样做

location=${(j._.)${${(s._.)my_variable}[3,4]}}
echo $location # cambridge_MA
但我想知道是否有比拆分然后加入更简单的语法

编辑:经过一些研究,我发现我可以使用backreferences标志
(#b)

尽管设置长正则表达式似乎有点麻烦


还有其他想法吗?

拆分和加入对我来说似乎是最清晰的方法。您有一个操作指定如何分解字符串,还有一个操作指定保留哪些字段

如果要使用多个字段,请一次性将其拆分为一个数组

details=("${(@s:_:)my_variable}")
location=${(j:_:)details[3,4]}
要提取固定位置的字段,还可以使用前缀和后缀剥离:

city=${${my_variable#*_*_}%%_*}
但是,仅仅提取一个字段就已经有两个操作了,而且除非知道字段的数量,否则它不会干净地推广到多个连续字段,在这种情况下,您可以像去掉前缀一样去掉后缀

location=${${my_variable#*_*_}%_*_*}
虽然可以使用
I
参数扩展标志在简单搜索中组合这两者,但这需要将搜索定位在分隔符处。这是可行的,但它比拆分和合并要麻烦得多

setopt extended_glob
echo ${${(MSI:2:)my_variable##_[^_]##_[^_]##}#_}

谢谢,我认为分割成一个数组是我错过的一个重要部分
setopt extended_glob
echo ${${(MSI:2:)my_variable##_[^_]##_[^_]##}#_}