拆分字符串“创建一个空字符串[重复]

问题描述 投票:0回答:2

这个问题在这里已有答案:

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

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

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

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

  1. 在分裂时以某种方式摆脱空白。
  2. 使用空格创建数组,然后创建另一个数组,并仅将第一个中的元素插入到非空格的第二个数组中。

我正在标记答案,因为bash和ksh作为解决方案,bash也是可以接受的。谢谢!

string bash shell ksh
2个回答
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
投票

如果你想用双引号存储字符串而忽略其余部分,这里有一个正确处理awk<newline>解决方案:

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

使用bash 4.4或更高版本:

readarray -d '' arr < <(cmd | gawk -v RS='"[^"]*"' 'RT { gsub("\"", "", RT); printf RT"\0"}')
© www.soinside.com 2019 - 2024. All rights reserved.