使用bash将字符串转换为数组,以表达对分组的引用

时间:2016-05-22 08:39:52

标签: bash

我有一个字符串:

echo "${Str}"

This string has "a substring". 

字符串有逗号,所以如果我打印字符串,我会看到:

$ Tmp=( ${Str} )
$ echo "${Tmp[3]}"
"a
$ echo "${Tmp[4]}"
Substring"

如果我输入命令:

a Substring

我想要打印:A project With an Output Type of Class Library cannot be started directly. In order to debug this project, add an executable project to this solution which references the library project. Set the executable project as the startup project. 有什么建议? 我可以更改逗号,但必须将它从Str打印到Tmp

3 个答案:

答案 0 :(得分:3)

此问题需要使用xargs(它将引用的字符串保留在一起):

$ Str='This string has "a substring"'
$ IFS=$'\n' arr=( $(xargs -n1 <<<"$Str") )
$ printf '<%s>\n' "${arr[@]}"
<This>
<string>
<has>
<a substring>

所以,你需要的元素:

$ echo "${Tmp[3]}"
a substring

请注意,“未加引号”的项目将删除前导或尾随空格:

$ Str='  This    string    has "   a substring  "'
$ IFS=$'\n' arr=( $(xargs -n1 <<<"$Str") )
$ printf '<%s>\n' "${arr[@]}"
<This>
<string>
<has>
<   a substring  >

答案 1 :(得分:0)

如果您已经知道要查找的单词的索引,将字符串转换为数组就像使用括号一样简单:

tmp=($(echo $Str))

然后你可以 echo ${tmp[4]} ${tmp[5]} 打印一个没有逗号的“子串”。

但是,如果您已经知道子字符串是什么,为什么不grep来自原始字符串?

echo $Str | grep -o "a substring"

将以相同的方式返回子字符串,但您不必担心子字符串的长度或数组中字的索引。

编辑:顺便说一句,如果你只想删除你可以做的任何字符串的第一个和最后一个字符(bash 4.2及以上):

echo ${Str:1:-1}

答案 2 :(得分:0)

尝试一下:

 Str='this string has "a substring"'
 eval Tmp=( "${Str}" )

 printf "%s\n" "${Str}"
 this string has "a substring"

 printf "%s\n" "${Tmp[3]}"
 a substring

 set | grep "^Tmp"
 Tmp=([0]="this" [1]="string" [2]="has" [3]="a substring")

我必须警告你关于eval,请参阅@charlesduffy的评论:只有先前使用您自己的代码行生成Str时才使用它。