我从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 :(得分: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