使用sed的输出进行一会儿读取循环

时间:2019-03-28 16:05:46

标签: linux bash while-loop

我希望while循环忽略空白(空)行和包含#

的行

我尝试在输入文件中包含sed -e's /#.*$//'-e'/ ^ $ / d'并将其通过管道传递到while循环中。这没用。

file=$(sed -e 's/#.*$//' -e '/^$/d' foo.txt)

while IFS=: read -r f1 f2 f3 f4; do 

Command

done <"$file"

3 个答案:

答案 0 :(得分:4)

您正在尝试以文件名打开该输出,几乎可以肯定不是。

在子shell中运行sed,并将其输出重定向到while循环。

while IFS=: read -r f1 f2 f3 f4; do
    # do something
done < <(sed -e 's/#.*$//' -e '/^$/d' foo.txt)

对于对此答案中使用的语法如何工作感兴趣的任何人,请参见the bash-hackers' wiki on process substitution,以及为什么此语法比sed ... | while read ...更好的原因,请参见BashFAQ #24

答案 1 :(得分:0)

您可以使用grep

grep -Ev '^\s*$|^\s*#' foo.txt | while IFS=: read -r f1 f2 f3 f4; do 
    Command
done

答案 2 :(得分:-2)

使用grep -v:

-v, --invert-match        select non-matching lines