“阅读”每行跳过最后一个字

问题描述:

我从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 
+0

避免不必要的'cat's:'while read line;做...;完成 knittl 2012-02-25 18:38:55

你看到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 
+0

这似乎像一个魅力工作,猜测我太使用阅读,因为我用它来读取文件挂了。 – Asgeir 2012-02-25 18:36:27

+0

不确定,但我认为这将使$ line符合通常的shell扩展,这可能会比你想要的更多。您将需要试验输入行中包含双引号和单引号和反引号(平衡和不平衡)和美元符号('$')的情况。如果这对你来说是一个问题,你可以考虑基于'fmt'的解决方案,我在下面建议。 – 2012-02-25 19:00:16

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 
+0

这似乎像一个魅力工作,猜测我太被挂上使用阅读,因为我用它来读取文件 – Asgeir 2012-02-25 18:36:56

尝试使用剪切命令,而不是读-d

如果你不需要记住线的分界线,fmt命令可以非常有用。 fmt将stdin上的纯文本重排为给定的最大行长度,因此,如果将其最大行长度设为1,则最终会将输入的每个单词分割到其自己的行中。对于你的问题,也许

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