2014-01-20 121 views
2

我有一个读取循环,它正在读取一个变量,但不像我期望的那样行为。我想读取变量的每一行并处理每一行。这里是我的循环:bash读取循环只读取输入变量的第一行

while read -r line 
do 
    echo $line | sed 's/<\/td>/<\/td>$/g' | cut -d'$' -f2,3,4 >> file.txt 
done <<< "$TABLE" 

我期望它处理文件的每一行,但它只是做第一个。如果我的中间是简单的echo $ line >> file.txt,它按预期工作。这里发生了什么?我如何得到我想要的行为?

+3

你能告诉'猫-vte <<< “$表”'输出 – anubhava

+0

输出仅仅是'$' –

+0

所以你原来的字符串'$ TABLE'是空的? – anubhava

回答

0

看起来你的线条被\r而不是\n分隔。

使用此While循环来重复利用的read -d $'\r'输入:

while read -rd $'\r' line; do 
    echo "$line" | sed 's~</td>~</td>$~g' | cut -d'$' -f2,3,4 >> file.txt 
done <<< "$TABLE" 
+0

工作就像一个魅力! –

+0

不客气,很高兴它解决了。 – anubhava

0

如果$TABLE包含一个多行字符串,我建议

printf '%s\n' "$TABLE" | 
while read -r line; do 
    echo $line | sed 's/<\/td>/<\/td>$/g' | cut -d'$' -f2,3,4 >> file.txt 
done 

这也更加便携,因为“< < <”运营商在这里串是不是POSIX。