如何将一行划分为bash中由一个或多个空格分隔的单词?

时间:2009-12-29 17:37:56

标签: bash

我知道如何在python中完成它,只需

line = db_file.readline()
ll=string.split(line)

但我怎样才能在bash中做同样的事情?是否真的有可能以这么简单的方式做到这一点?

9 个答案:

答案 0 :(得分:119)

s='foo bar baz'
a=( $s )
echo ${a[0]}
echo ${a[1]}
...

答案 1 :(得分:32)

如果你想要一行中的特定单词,awk可能会有用,例如

$ echo $LINE | awk '{print $2}'

在$ LINE中打印第二个空格分隔的单词。您还可以拆分其他字符,例如

$ echo "5:6:7" | awk -F: '{print $2}'
6

答案 2 :(得分:29)

这取决于 split 的含义。如果你想迭代一行中的单词,这是一个变量,你可以迭代。例如,假设变量linethis is a line。然后你可以这样做:

for word in $line; do echo $word; done

这将打印:

this
is
a
line

for .. in $var使用$var中的值拆分$IFS,其默认值表示“拆分空白和换行符”。

如果您想从用户或文件中读取行,您可以执行以下操作:

cat $filename | while read line
do
    echo "Processing new line" >/dev/tty
    for word in $line
    do
        echo $word
    done
done

对于其他任何事情,您需要更加明确并更详细地定义您的问题。

注意:编辑删除bashism,但我仍然保留cat $filename | ...,因为我更喜欢重定向。

答案 3 :(得分:16)

echo $line | tr " " "\n"

给出的输出类似于上面大多数答案的输出;不使用循环。


在您的情况下,您还提到了ll=<...output...>
所以,(假设我不太了解python并假设你需要将输出分配给变量),

ll=`echo $line | tr " " "\n"`

应该足够了(记得echo "$ll"而不是echo $ll

答案 4 :(得分:9)

$ line="these are words"
$ ll=($line)
$ declare -p ll  # dump the array
declare -a ll='([0]="these" [1]="are" [2]="words")'
$ for w in ${ll[@]}; do echo $w; done
these
are
words

答案 5 :(得分:9)

这样做

while read -r line
do
  set -- $line
  echo "$1 $2"
done <"file"

$ 1,$ 2等将是你的第一和第二分裂“领域”。使用$ @来获取所有值。使用$#来获取“字段”的长度。

答案 6 :(得分:4)

read-a选项可让您按$IFS中包含的字符拆分读入的行。

答案 7 :(得分:4)

更简单,

echo $line | sed 's/\s/\n/g'
  

\ s - &gt;空白字符(空格,制表符,NL,FF,VT,CR)。在很多   系统也有效[:space:]

     

\ n - &gt;新行

答案 8 :(得分:2)

如果您已经在变量$ LINE中包含了您的文本行,那么您应该可以说

for L in $LINE; do
   echo $L;
done