2011-05-10 40 views
1

我有一个文件,它有很长的数据行。当我尝试使用shell脚本读取时,数据会进入多行,即在某些点中断。阅读很长的一行,而没有在shell脚本中分成多行

例行:

B_18453583||Active|917396140129|405819121107402|Active|7396140129||7396140129|||||||||18-MAY-10|||||18-MAY-10|405819121107402|Outgoing International Calls,Outgoing Calls,WAP,Call Waiting,MMS,Data Service,National Roaming-Voice,Outgoing International Calls except home country,Conference Call,STD,Call Forwarding-Barr,CLIP,Incoming Calls,INTSNS,WAPSNS,International Roaming-Voice,ISD,Incoming Calls When Roaming Internationally,INTERNET||For You Plan|||||||||||||||||| 

所有这是一个单行的内容。 我使用的是正常的读这样的:

var=`cat pranay.psv` 
for i in $var; do 
    echo $i 
done 

输出当属:

B_18453583||Active|917396140129|405819121107402|Active|7396140129||7396140129|||||||||18- MAY-10|||||18-MAY-10|405819121107402|Outgoing 
International 
Calls,Outgoing 
Calls,WAP,Call 
Waiting,MMS,Data 
Service,National 
Roaming-Voice,Outgoing 
International 
Calls 
except 
home 
country,Conference 
Call,STD,Call 
Forwarding-Barr,CLIP,Incoming 
Calls,INTSNS,WAPSNS,International 
Roaming-Voice,ISD,Incoming 
Calls 
When 
Roaming 
Internationally,INTERNET||For 
You 
Plan|||||||||||||||||| 

如何打印所有单行? 请帮忙。
谢谢

回答

4

这是因为word splitting。一个简单的方法来做到这一点(这也与useless use of cat解散)是这样的:

while IFS= read -r -d $'\n' -u 9 
do 
    echo "$REPLY" 
done 9< pranay.psv 

详细讲解:

  • $“...”可用于创建人类可读的字符串转义序列。见man bash
  • IFS=有必要避免IFS中的任何字符从$ REPLY的开头和结尾中删除。
  • -r避免在文本中专门解释反斜杠。
  • -d $'\n'按换行符分行。
  • 使用文件描述符9进行数据存储而不是标准输入,以避免贪吃像cat这样的命令。
1

您需要正确的引用。在你的情况下,你应该使用命令read

while read line ; do 
    echo "$line" 
done < pranay.psv