Bash пропускать пустые строки при повторении строки по строке

Я повторяю файл по строкам и помещаю каждое слово в массив, и это работает. Но он также берет пустые строки и помещает их как элемент в массив, как я могу пропустить пустые строки?

Пример файла

      Line 1
line 2

line 3
        line 4 

line 5
   line 6

Мой код

while read line ; do
            myarray[$index]="$line"
            index=$(($index+1))
    done < $inputfile

Возможный код psuedo

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

Ответ 1

Сначала удалите пустые строки с помощью sed.

for word in `sed '/^$/d' $inputfile`; do
    myarray[$index]="$word"
    index=$(($index+1))
done

Ответ 2

Будьте более элегантны:

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

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

Ответ 3

Внедрите те же тесты, что и в вашем псевдокоде:

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

Тест -z означает true if empty. ! отрицает (т.е. true, если не пусто).

Вы также можете использовать выражения, такие как [ "x$line" = x ] или test "x$line" = x, чтобы проверить, является ли строка пустой.

Однако любая строка, содержащая пробел , будет считаться пустой. Если это проблема, вы можете использовать sed для удаления таких строк из ввода (включая пустые строки), прежде чем они будут переданы в цикл while, как в:

sed '/^[ \t]*$/d' $inputfile | while read line; do
    myarray[$index]="$line"
    index=$(($index+1))
done

Ответ 4

cat -b -s file |grep -v '^$'

Я знаю, что он решил, но мне нужно было выводить нумерованные строки, игнорируя пустые строки, поэтому я подумал о том, чтобы поместить его прямо здесь, если кому-то это понадобится.:)

Ответ 5

Используйте grep для удаления пустых строк:

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

Ответ 6

Эта версия очень быстро по сравнению с решениями, которые вызывают внешние команды, такие как 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