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
togrep
?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