如何从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##_[^_]##_[^_]##}#_}