拆分字符串“会创建一个空字符串

时间:2017-12-18 22:26:34

标签: string bash shell ksh

我在shell脚本中使用一个命令,它返回多个字符串,每个字符串都包含在""中。由于我需要将每个字符串作为数组的单独元素,因此我使用"作为分隔符来拆分此字符串集合,如下所示:

IFS='"'
arr=($(command that returns multiple strings enclosed in ""))

现在,由于每个字符串的开头都有一个"字符,我的脚本会将每个字符串拆分为一个空字符串和字符串本身。例如,字符串"foo" "bar"将分为(空字符串),foo(再次为空字符串)和bar。所以我的数组最终有4个元素,而不是2个。

有两种方法可以解决这个问题,任何实施方面的帮助都会有所帮助:

  1. 分裂时以某种方式摆脱空白。
  2. 使用空格创建数组,然后创建另一个数组,并且只将第一个中的元素插入第二个数组中,而不是空格。
  3. 我正在标记答案,因为bash和ksh作为解决方案,bash也是可以接受的。谢谢!

2 个答案:

答案 0 :(得分:2)

除非引用的字符串包含换行符,否则您可以使用xargs将引用的字符串处理为NUL分隔的单词列表:

array=( )
while IFS= read -r -d '' piece; do
  array+=( "$piece" )
done < <(command-that-returns-multiple-quoted-strings | xargs printf '%s\0')

如果您要拆分的引用字符串执行包含换行符,xargs将无法正常工作;请考虑使用Python标准库shlex module

shell_quotes_to_NULs() {
  python -c '
import sys, shlex
for piece in shlex.split(sys.stdin.read()):
    sys.stdout.write(piece)
    sys.stdout.write("\0")
'
}

array=( )
while IFS= read -r -d '' piece; do
  array+=( "$piece" )
done < <(command-that-returns-multiple-quoted-strings | shell_quotes_to_NULs)

答案 1 :(得分:1)

如果您想用双引号存储字符串并忽略其余部分,这里有一个正确处理awk的{​​{1}}解决方案:

<newline>

使用arr=(); while IFS= read -r -d '' item; do arr+=("$item"); done < <(cmd | gawk -v RS='"[^"]*"' 'RT { gsub("\"", "", RT); printf RT"\0"}'); 4.4或更高版本:

bash