URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 95343
[ Назад ]

Исходное сообщение
"Bash - чтение строк из файла"

Отправлено Smjbv , 13-Янв-14 16:50 
Надо прочитать строчки из файла без учета пустых строк и комментариев.

вот так:

while read line; do
  echo "[$line]";
done < ./host_list

читает все подряд (и пустые строки и комментарии)

Подскажите пожалуйста как сделать??


Содержание

Сообщения в этом обсуждении
"Bash - чтение строк из файла"
Отправлено Аноним , 13-Янв-14 19:56 
> Подскажите пожалуйста как сделать??

Как-то так:

grep -v '^ *\(#\|$\)' host_list


"Bash - чтение строк из файла"
Отправлено Andrey Mitrofanov , 13-Янв-14 23:25 
> Надо прочитать строчки из файла без учета пустых строк и комментариев.
> читает все подряд (и пустые строки и комментарии)
> Подскажите пожалуйста как сделать??

Поскольку bash обозначен в теме, то - пусть позиксивисты захлебнутся -

while read line; do
    [[ "$line" =~ ^\ *(#|$) ]] && continue
    echo "[$line]";
done < ./host_list

  или, оформив grep из первого ответа,

while read line; do
    echo "[$line]";
done < <( egrep -v '^ *(#|$)' <./host_list)


"Bash - чтение строк из файла"
Отправлено михалыч , 14-Янв-14 08:21 
> Поскольку bash обозначен в теме, то - пусть позиксивисты захлебнутся -

Пусть. Изойдутся слюной и захлебнутся. Нам не жаль. ))

#!/bin/sh

while read line; do
    if [ "$line" = "${line%#*}" -a "$line" ]; then
        echo $line
    fi
done < ./host_list

Чисто "чистый" shell. Без примесей.

"Bash - чтение строк из файла"
Отправлено Smjbv , 14-Янв-14 17:32 
А если сделать например так:

while read line; do
  tmp=${line##*/}
  tmp=${tmp%%*/}
  tmp=${tmp###*}
  if [ "$tmp" !=  "" ]
  then
    echo "[$tmp]";
  fi
done < ./host_list

Насколько правилен и оптимален этот код??


"Bash - чтение строк из файла"
Отправлено михалыч , 14-Янв-14 20:26 
path="ab/cd/ef"
echo "${path}"
echo "${path%/*}"       # НЕ жадный - удаляет всё, начиная с конца  до первого    слеша включительно
echo "${path%%/*}"      #    жадный - удаляет всё, начиная с конца  до последнего слеша включительно
echo "${path#*/}"       # НЕ жадный - удаляет всё, начиная с начала до первого    слеша включительно
echo "${path##*/}"      #    жадный - удаляет всё, начиная с начала до последнего слеша включительно
dirname "${path}"
basename "${path}"

выхлоп
ab/cd/ef
ab/cd
ab
cd/ef
ef
ab/cd
ef
Учитывая это, корректней было бы в моём примере вместо ${line%#*} написать
${line%%#*} или ${line#*#}

Насчёт оптимальности вашего примера ничего не скажу, вам решать, но по мне так привычнее regexp у sed, grep, etc..