【问题标题】:bash - split string into array WITH empty valuesbash - 将字符串拆分为空值数组
【发布时间】:2016-10-31 17:41:07
【问题描述】:
pattern="::a::b::"
oldIFS=$IFS
IFS="::"
read -r -a extractees <<< $pattern
IFS=$oldIFS

这会导致

{"a","b"}

但是,我需要维护索引,所以我想要

{"","a","b",""}

(为了比较,如果我想要{"a","b"},我会写"a::b"

为什么?因为这些元素稍后会再次拆分(在不同的分隔符上),空的 "" 值应该导致一个空列表然后

我如何做到这一点?

【问题讨论】:

  • @Cyrus {"","a","b",""} - 正如我在帖子中所写的那样。如果:: 是分隔符并且它会更改索引,{"","a","","b",""} 将毫无意义。

标签: bash text split pattern-matching


【解决方案1】:

遗憾的是,任何字段分隔符都不能超过 1 个字符,所以'::' → ':'

除此之外,应该明确关闭通配符,以防止未引用变量中潜在的文件名扩展。

set -f # disable globbing
pattern=":a:b c:"
oldIFS=$IFS
IFS=":"
extractees=($pattern)
IFS=$oldIFS

echo "'${extractees[0]}'"
echo "'${extractees[1]}'"
echo "'${extractees[2]}'"
echo "'${extractees[3]}'"

【讨论】:

  • 不带引号的参数扩展也不是将字符串拆分为数组的可靠方法。
  • @chepner 好的。 $IFS 已经设置好了,所以唯一会影响未引用扩展的是文件名通配符。但是,它不会在这里发生;刚刚在 BASH 4.3 上尝试过。不知道具体原因是什么,这个案子貌似无证。但为了安全起见,始终可以通过set -f 明确禁用通配。已编辑。
  • @chepner 连续的空白字符被删除只有如果$IFS 等于它的默认值。 Prooflink.
  • 啊,对。绝对要提到应该关闭通配符。
猜你喜欢
  • 1970-01-01
  • 2011-11-26
  • 2021-10-09
  • 1970-01-01
  • 2018-05-01
  • 2016-01-27
  • 2015-08-28
  • 1970-01-01
相关资源
最近更新 更多