it-swarm.dev

bash dosya satırında satır satır yineleme yaparken boş satırları atla

Bir dosya satır satır satır yineleme ve her Word bir dizi içine koymak ve işe yarıyor. Ancak, boş satırları da alır ve dizideki bir öğe olarak koyar, boş satırları nasıl atlayabilirim? 

örnek dosya

      Line 1
line 2

line 3
        line 4 

line 5
   line 6

Benim kod

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

Olası psuedo kodu

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

Önce boş satırları sed ile kaldırın.

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

Daha şık ol:

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

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

Sözde kodunuzdaki ile aynı testi uygulayın:

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

-z testi true if empty anlamına gelir. ! olumsuzlar (yani boş değilse doğru).

Satır boş olup olmadığını test etmek için [ "x$line" = x ] veya test "x$line" = x gibi ifadeler de kullanabilirsiniz.

Bununla birlikte, boşluk içeren _ boşluk sayılmaz. Bu bir sorunsa, girişten bu tür satırları kaldırmak için sed kullanabilirsiniz (boş satırlar dahil), while döngüsüne iletilmeden önce, aşağıdaki gibi:

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

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

Çözülmüş olduğunu biliyorum, ancak boş satırları yok sayarak numaralandırılmış satırlar çıkarmam gerekiyordu, bu yüzden birinin ihtiyacı olması durumunda hemen buraya koymayı düşündüm. :)

3
Kostas Andrianos

Boş satırları kaldırmak için grep kullanın:

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

Bu sürüm, sed ve grep gibi harici komutları çağıran çözümlere kıyasla çok hızlıdır. Ayrıca, yalnızca boşluk içeren satırları atlar, satırların atlanması için boş olması gerekmez.

#!/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
0
Galik