2014-09-03 50 views
1

我必须解析文件的格式如下:猛砸while循环与读取和IFS

line1_param1:line1_param2:line1_param3: 
line1_param2:line2_param2:line2_param3: 
line1_param3:line3_param2:line3_param3: 

并处理线就行,从当前行提取所有参数。目前我已经以这种方式管理它:

IFS=":" 
grep "nice" some_file | sort > tmp_file 
while read param1 param2 param3 
do 
    ..code here.. 
done < tmp_file 
unset IFS 

如何避免创建临时文件?由于整个线路被分配到参数1

IFS=":" 
while read param1 param2 param3 
do 
    ..code here.. 
done <<< $(grep "nice" some_file | sort) 
unset IFS 

不幸的是,这并不正常工作。

回答

5

您可以使用process substitution本:

while IFS=: read -r param1 param2 param3 
do 
    echo "Any code here to process: $param1 $param2 $param3" 
done < <(grep "nice" some_file | sort) 
2

如果您正在使用bash 4.2或更高版本,可以启用lastpipe选项可使用“天然”管道。 while循环将在当前shell中执行,而不是在子shell中执行,因此您设置或更改的变量在流水线后仍然可见。 (偷anubhava的罚款答案来演示。)

shopt -s lastpipe 
grep "nice" some_file | sort | while IFS=: read -r param1 param2 param3 
do 
    echo "Any code here to process: $param1 $param2 $param3" 
done