Bash 逐行遍历文件时跳过空行

Bash 逐行遍历文件时跳过空行,bash,Bash,我逐行遍历一个文件,并将每个单词放入一个数组中,这样就可以了。但是它也会拾取空白行并把它作为数组中的一个项目,我如何跳过空白行? 示例文件 Line 1 line 2 line 3 line 4 line 5 line 6 我的代码 while read line ; do myarray[$index]="$line" index=$(($index+1)) done < $inputfil

我逐行遍历一个文件,并将每个单词放入一个数组中,这样就可以了。但是它也会拾取空白行并把它作为数组中的一个项目,我如何跳过空白行? 示例文件

      Line 1
line 2

line 3
        line 4 

line 5
   line 6
我的代码

while read line ; do
            myarray[$index]="$line"
            index=$(($index+1))
    done < $inputfile
读行时
;做
myarray[$index]=“$line”
索引=$($索引+1))
完成<$inputfile
可能的psuedo代码

while read line ; do
           if (line != space);then
            myarray[$index]="$line"
             fi
            index=$(($index+1))
    done < $inputfile
读行时
;做
if(行!=空格);然后
myarray[$index]=“$line”
fi
索引=$($索引+1))
完成<$inputfile

> p>首先用“代码> SED”删除“空白行”。< /P>
for word in `sed '/^$/d' $inputfile`; do
    myarray[$index]="$word"
    index=$(($index+1))
done

实现与伪代码中相同的测试:

while read line; do
    if [ ! -z "$line" ]; then
        myarray[$index]="$line"
        index=$(($index+1))
    fi
done < $inputfile

使用GRIP删除空白行:

for word in $(cat ${inputfile} | grep -v "^$"); do
   myarray[$index]="${word}"
   index=$(($index+1))
done
更加优雅:

echo "\na\nb\n\nc" | grep -v "^$"

cat $file | grep -v "^$" | next transformations...

与调用外部命令(如
sed
grep
)的解决方案相比,此版本速度非常快。此外,它还会跳过仅包含空格的行,这些行不需要为空即可跳过

#!/bin/bash

myarray=()
while read line
do
    if [[ "$line" =~ [^[:space:]] ]]; then
        myarray+=("${line}")
    fi
done < test.txt

for((i = 0; i < ${#myarray[@]}; ++i))
do
    echo ${myarray[$i]}
done
#/bin/bash
myarray=()
读行时
做
如果[[“$line”=~[^[:space:][]];然后
myarray+=(“${line}”)
fi
完成
cat-b-s文件| grep-v'^$'


我知道它已经解决了,但是,我需要输出带编号的行,而忽略空行,所以我想把它放在这里,以防有人需要它。:)

它可以是简单的:
if[“$line”];然后
是的,它在Linux/bash上工作。。。不确定其他/旧的Unix和Shell。autoconf工具专门使用
测试“x$line”=x
表单来实现最大的可移植性。我可以为sed添加一些东西吗?如果在一行中的第一个字母之前有空格,可以删除该空格或该行中第一个字母之前的空格?那么,您可以使用:
sed-e'/^[\t]*$/d'-e's/^[\t]*/'
删除空白行或所有空白行,并删除行中非空白行之前的所有前导空格。将代码复制到顶部,对吗?我没有得到好的结果。为什么要将
cat
转换为
grep
grep-v“^$”“$inputfile”
不也是这样吗?两者都是正确的。我只是习惯用“cat”,因为有时候我需要用“echo”来代替“cat”。为什么要用
cat
to
grep
grep-v“^$”“$inputfile”
不是也可以吗?因为输出要通过管道传输到另一个操作,所以在输入文件中通过管道传输比作为参数提供要好。这样,您就可以从左到右直接读取数据流,而不是从中间开始,向左走然后向右跳。诚然,它浪费了4个字符和几毫秒,但我认为这没什么大不了的。此外,如果输入来自其他地方,以这种方式显示它可以很容易地交换管道的第一阶段。
$file
应该在这里加上双引号。不能保证文件名不包含空格。我不清楚OP会如何使用这个答案。将最后一行替换为
$inputfile
?“更加优雅”和
cat…|grep通常被认为是矛盾的(因为“优雅”本身就是主观的)<代码>cat
grep
通常被认为是不良形式。如果您想要实现只将输入文件放在第一位的目标,那么可以通过
<“$file”grep”模式实现同样的目标…| cmd |…
作为
cat
的替代方案(通常会重新格式化多个输出),
grep
还可以添加行号。如果匹配每一行,则不会跳过任何数字:例如,
grep-v'^$”文件| grep-n.
(您可以通过
sed将冒号(
)转换为其他数字)
#!/bin/bash

myarray=()
while read line
do
    if [[ "$line" =~ [^[:space:]] ]]; then
        myarray+=("${line}")
    fi
done < test.txt

for((i = 0; i < ${#myarray[@]}; ++i))
do
    echo ${myarray[$i]}
done