2014-09-03 49 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