我正在逐行遍历文件并将每个单词放入数组中,这有效。 但它也会拾取空白行并将其作为数组中的项目,如何跳过空白行?
示例文件
Line 1
line 2
line 3
line 4
line 5
line 6
我的代码
while read line ; do
myarray[$index]="$line"
index=$(($index+1))
done < $inputfile
可能的伪代码
while read line ; do
if (line != space);then
myarray[$index]="$line"
fi
index=$(($index+1))
done < $inputfile
更优雅:
echo "nanbnnc" | grep -v "^$"
cat $file | grep -v "^$" | next transformations...
实现与伪代码中相同的测试:
while read line; do
if [ -n "$line" ]; then
myarray[$index]="$line"
index=$(($index+1))
fi
done < $inputfile
-n
测试意味着true if not empty
。
您还可以使用 [ "x$line" = x ]
或 test "x$line" = x
等表达式来测试该行是否为空。
但是,任何包含空格的行都不会被视为空。如果这是一个问题,您可以使用sed
从输入中删除这些行(包括空行),然后再将它们传递到while
循环,如下所示:
sed '/^[ t]*$/d' $inputfile | while read line; do
myarray[$index]="$line"
index=$(($index+1))
done
先用 sed
删除空白行。
for word in `sed '/^$/d' $inputfile`; do
myarray[$index]="$word"
index=$(($index+1))
done
cat -b -s file |grep -v '^$'
我知道它已经解决了,但是,我需要输出编号的行而忽略空行,所以我想把它放在这里,以防有人需要它。 :)
使用 grep 删除空白行:
for word in $(cat ${inputfile} | grep -v "^$"); do
myarray[$index]="${word}"
index=$(($index+1))
done
与调用外部命令(如 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
这是我一直在做的方式。不需要调用 grep,也不需要有两个级别的缩进。
while read line; do
# skip empty lines
[ -z "$line" ] && continue
echo "processing $line"
done < "$inputfile"