Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 将逗号分隔的字符串拆分为多个单词,以便循环遍历每个单词_Bash_Split - Fatal编程技术网

Bash 将逗号分隔的字符串拆分为多个单词,以便循环遍历每个单词

Bash 将逗号分隔的字符串拆分为多个单词,以便循环遍历每个单词,bash,split,Bash,Split,我想拆分一个字符串,以便在Bash中与for循环一起使用。例如,我有这个字符串 hello,my,name,is,mindia 我想把它分成几个单词,这样我就可以循环每个单词了。有人能帮我吗?您可以使用模式替换: s="hello,my,name,is,mindia" for i in ${s//,/ } do echo $i done 以下是一个可以处理空白的版本: while IFS= read -r -d ',' i; do printf "%s\n" "$i" don

我想拆分一个字符串,以便在Bash中与for循环一起使用。例如,我有这个字符串

hello,my,name,is,mindia

我想把它分成几个单词,这样我就可以循环每个单词了。有人能帮我吗?

您可以使用模式替换:

s="hello,my,name,is,mindia"
for i in ${s//,/ }
do
    echo $i
done
以下是一个可以处理空白的版本:

while IFS= read -r -d ',' i; do
    printf "%s\n" "$i"
done <<<"${s:+$s,}"
而IFS=read-r-d','i;做
printf“%s\n”$i

完成您可以使用模式替换:

s="hello,my,name,is,mindia"
for i in ${s//,/ }
do
    echo $i
done
以下是一个可以处理空白的版本:

while IFS= read -r -d ',' i; do
    printf "%s\n" "$i"
done <<<"${s:+$s,}"
而IFS=read-r-d','i;做
printf“%s\n”$i
完成

修复了空格问题:

以及输出:

a
b
c
d
f

修复了空格问题:

以及输出:

a
b
c
d
f
使用纯和无
拆分
(或者您的意思是
剪切
):

说得好。不过,与其他答案相比,有一点很好:如果字段中有空格,此方法仍然有效:

$ string="hello,this field has spaces in it,cool,it,works"
$ IFS=, read -r -a array <<< "$string"
$ printf "%s\n" "${array[@]}"
hello
this field has spaces in it
cool
it
works
$string=“您好,此字段中有空格,酷,行”
$IFS=,read-r-a数组使用纯和非
拆分
(或者您的意思是
cut
):

说得好。不过,与其他答案相比,有一点很好:如果字段中有空格,此方法仍然有效:

$ string="hello,this field has spaces in it,cool,it,works"
$ IFS=, read -r -a array <<< "$string"
$ printf "%s\n" "${array[@]}"
hello
this field has spaces in it
cool
it
works
$string=“您好,此字段中有空格,酷,行”

$IFS=,read-r-a数组非常简单的方法是使用单词拆分来数组:

s="hello,my,name,is,mindia"
a=( $s )
将输入字段分隔符设置为:

IFS=,
然后将字符串拆分为数组:

s="hello,my,name,is,mindia"
a=( $s )
结果:

for word in "${a[@]}"; do echo "- [$word]"; done

非常简单的方法是使用分词来排列:

s="hello,my,name,is,mindia"
a=( $s )
将输入字段分隔符设置为:

IFS=,
然后将字符串拆分为数组:

s="hello,my,name,is,mindia"
a=( $s )
结果:

for word in "${a[@]}"; do echo "- [$word]"; done


您尝试了什么来解决这个问题?您尝试了什么来解决这个问题?这也将在空格处剪切字符串:它失败,例如,使用
s=“hello,my,name,is,mindia,并且此字段中有空格,ooops”
OP没有明确指出这是必需的,因此我不认为这是一个主要问题。我添加了一个处理空白的版本。关于编辑:当字符串为空或最后一个字段为空时,您会有副作用…@gniourf_gniourf感谢您发现了该错误。我修复了空字符串的情况,但是我认为尾随逗号的处理是一个特性而不是bug。我认为如果要支持空字段,则应将
“a”,b,
分为
“a”
“b”
”。这也将在空格处剪切字符串:它失败,例如,使用
s=“你好,我的,名字,is,mindia,此字段中有空格,oops”
OP没有明确指出这是必需的,因此我不认为这是一个主要问题。我添加了一个处理空白的版本。关于编辑:当字符串为空或最后一个字段为空时,您会有副作用…@gniourf_gniourf感谢您发现了该错误。我修复了空字符串的情况,但是我认为尾随逗号的处理是一个特性而不是bug。我认为如果要支持空字段,
“a,b,”
应该被分成
“a”
“b”
”。就像tom的答案一样,如果任何元素有空格,它都会被屏蔽。就像tom的答案一样,如果任何元素有空格,它都会被屏蔽。你能解释一下这一点吗
?请注意,使用此方法,
IFS
是全局设置的。。。如果你以后忘记了它,你可能会有惊喜。当你有数组“xxx”时,你想迭代它的元素,这就是要使用的语法。“${xxx[@]}”更改为“${xxx[0]}”${xxx[1]}”……实际上,如果您愿意全局设置
IFS
,那么您最好根本不定义任何数组。只需继续:
s=你好,我的名字是mindia;如果S=,;对于i,单位为s美元;做回显“$i”;完成
IFS=,a=($s)
将全局设置
IFS
。请您解释一下这个
“${a[@]}”
?注意,使用这个方法,
IFS
是全局设置的。。。如果你以后忘记了它,你可能会有惊喜。当你有数组“xxx”时,你想迭代它的元素,这就是要使用的语法。“${xxx[@]}”更改为“${xxx[0]}”${xxx[1]}”……实际上,如果您愿意全局设置
IFS
,那么您最好根本不定义任何数组。只需继续:
s=你好,我的名字是mindia;如果S=,;对于i,单位为s美元;做回显“$i”;完成
IFS=,a=($s)
将全局设置
IFS