读取很长的一行,而不是在shell脚本中分成多行

时间:2011-05-10 07:39:45

标签: shell scripting

我有一个包含很长行数据的文件。当我尝试使用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||||||||||||||||||  

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

2 个答案:

答案 0 :(得分: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 :(得分:1)

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

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