“阅读”在每一行上跳过最后一个单词

时间:2012-02-25 18:22:21

标签: linux bash scripting

我从for循环中获取了一些奇怪的行为,它读取文件中的每一行,并在每行之后读取每个单词。读取会跳过每行的最后一个单词。我想我可能必须指明空格和换行都是分隔符,但我还没有发现如何做到这一点。以下是重要脚本的一部分:

  cat $i | while read line    
    do
        echo $line
        sleep 1
        #Process each word
        echo $line | while read -d ' '  word
        do
            echo $word
            sleep 1
        done
    done

4 个答案:

答案 0 :(得分:2)

您看到How to split one string into multiple strings separated by at least one space in bash shell?了吗?也许你可以这样做:

for word in $line
do
    echo $word
    sleep 1
done

答案 1 :(得分:2)

for命令的语法是:

      for name [ [in [words ...] ] ; ] do commands; done

展开单词,并对结果列表中的每个成员执行一次命令,名称绑定到当前成员。

cat $i | while read line    
do
    echo $line
    sleep 1
    #Process each word
    for word in $line
    do
        echo $word
        sleep 1
    done
done

答案 2 :(得分:0)

尝试使用cut命令而不是read -d

答案 3 :(得分:0)

如果您不需要记住行边界,fmt命令可能很有用。 fmt将stdin上的纯文本回流到给定的最大行长度,因此如果给它一个最大行长度,它最终会将输入的每个单词拆分到它自己的行上。对于你的问题,也许

cat $1 |
fmt -1 |
while read word
do
    # do something with $word
end

请注意,您已经丢失了所有原始行边界,并且您依赖于fmt对单词的定义。如果由于某种原因你真的需要线条边界,你可以考虑像

这样的东西
cat $1 |
while read line
do
    # do something with $line
    echo "$line" | 
    fmt -1 |
    while read word
    do
        # do something with $word
    done
done