“阅读”每行跳过最后一个字
我从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
你看到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
这似乎像一个魅力工作,猜测我太使用阅读,因为我用它来读取文件挂了。 – Asgeir 2012-02-25 18:36:27
不确定,但我认为这将使$ 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
这似乎像一个魅力工作,猜测我太被挂上使用阅读,因为我用它来读取文件 – 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
避免不必要的'cat's:'while read line;做...;完成 knittl 2012-02-25 18:38:55