让我们再试一次...假设您的数据中没有嵌入逗号,您可以使用read 命令的变体将字符串拆分为变量列表。
为了展示此解决方案如何处理嵌入的空白,我们将从您的示例字符串的修改版本开始:
$ input="1,2018-05-16,abc def,asdf 123"
我们现在告诉 read 使用逗号作为输入字段分隔符 (IFS),我们将使用 here-string 将 ${input} 传递给 read,这给了我们:
$ IFS=, read -r VAR1 VAR2 VAR3 VAR4 <<< "${input}"
$ echo "${VAR1}"
1
$ echo "${VAR2}"
2018-05-16
$ echo "${VAR3}"
abc def
$ echo "${VAR4}"
asdf 123
这应该比我之前基于参数替换的答案(如下)快一点 *plus* 你不会破坏${input} 的内容。
bash fiddle 表示上述解决方案,ksh93 fiddle 表示相同的解决方案。
我之前的回答/胡言乱语...
如果您可以使用数组,请在“bash split string into array”上运行搜索,您应该会得到几个 SO 命中来帮助您。
如果您绝对肯定需要使用单个变量,我可能会使用参数替换来去除字段。
${variable%%,*} # strip off the first field of a comma-delimited string
${variable#*,} # strip off fields 2-n of a comma-delimeted string
将此应用于我们得到的示例字符串:
$ input="1,2018-05-16,abc,123"
$ VAR1="${input%%,*}" input="${input#*,}"
$ VAR2="${input%%,*}" input="${input#*,}"
$ VAR3="${input%%,*}" input="${input#*,}"
$ VAR4="${input%%,*}" input="${input#*,}"
$ echo "${VAR1}"
1
$ echo "${VAR2}"
2018-05-16
$ echo "${VAR3}"
abc
$ echo "${VAR4}"
123
- 每个连续的
VAR= / input= 对将前导字段放入 VAR 并更新input 以包含其余字段
- 如果您需要保留
input 中的原始值,则首先将 input 复制到另一个可以拆分的变量中
虽然这可能看起来比使用 cut 或 awk 去除字段更像是编程,但主要好处是您不需要生成新的子流程(就像您一样对于cut 和awk 解决方案),因此您应该会发现性能有所提高(对于大量输入字符串处理,性能提高应该非常明显)。
显然 (?) 如果您正在处理 a) 包含逗号、b) 跨越多行和/或 c) 包含非打印/控制字符的数据,这可能会变得更加复杂......