我有一个包含许多单词的字符串,每个单词之间至少有一个空格。我如何把字符串分割成单独的单词,这样我就可以循环遍历它们?

字符串作为参数传递。例如:${2}== "cat cat file"。我怎么循环呢?

另外,如何检查字符串是否包含空格?


当前回答

对于我的用例,最好的选择是:

grep -oP '\w+' file

基本上,这是一个匹配连续非空格字符的正则表达式。这意味着任何类型和任何数量的空白都不匹配。-o参数在不同的行上输出每个匹配的单词。

其他回答

你试过把字符串变量传递给for循环吗?例如,Bash将自动对空白进行分割。

sentence="This is   a sentence."
for word in $sentence
do
    echo $word
done

 

This
is
a
sentence.

只需使用shell内置的“set”即可。例如,

set $text

在此之后,$text中的单个单词将以$1、$2、$3等形式存在。对于健壮性,通常是这样做的

set -- junk $text
shift

处理$text为空或以破折号开头的情况。例如:

text="This is          a              test"
set -- junk $text
shift
for word; do
  echo "[$word]"
done

这个打印

[This]
[is]
[a]
[test]

$ echo foo bar baz | sed 's/ /\n/g'

foo
bar
baz

我喜欢转换为数组,以便能够访问单个元素:

sentence="this is a story"
stringarray=($sentence)

现在你可以直接访问单个元素(它以0开头):

echo ${stringarray[0]}

或者转换回字符串以进行循环:

for i in "${stringarray[@]}"
do
  :
  # do whatever on $i
done

当然,之前已经回答了直接遍历字符串的问题,但这个回答的缺点是不能跟踪单独的元素以供以后使用:

for i in $sentence
do
  :
  # do whatever on $i
done

参见Bash数组参考。

另一个例子(使用Perl):

$ echo foo bar baz | perl -nE 'say for split /\s/'
foo
bar
baz