LINUX.ORG.RU
ФорумAdmin

bash.фильтр строк в while read

 


0

1

Добрый день,

есть файлик

source.txt
123
abc-1-bca
321
abc-2-bca
123
abc-3-bca

И есть скрипт:

while read line
do
 echo $line
done < source.txt

Надо только строки вида abc-*-bca, т.е. вывод должен быть такой:

abc-1-bca
abc-2-bca
abc-3-bca

Вроде задача простая, но я под конец дня уже сообразить не могу.

case "$line" in
    abc-*-bca)
        echo $line
    ;;
esac
joy4eg ★★★★★
()

lazy

while read line
do
 echo $line | grep -P "abc-\d-bca"
done < source.txt
entefeed ☆☆☆
()
Ответ на: комментарий от qulinxao

Да можно и без цикла, если не надо каждую строку обрабатывать.

grep '^abc-.*-bca$' source.txt

А если надо каждую, все равно проще

grep '^abc-.*-bca$' source.txt | while read ....

Kiborg ★★★
()

bash

IFS=$'\n'
for i in $(<test);do
  [[ $i = abc-*-bca ]]&& echo $i;done
nvidia
()

два варианта:

1. переназначить $IFS на «|», и парсить abc-3-def

read X Y Z

2. использовать такую магию:

while read line
do
 echo $line
done < <(grep 'abc-.*-def' source.txt)

emulek
()
Ответ на: комментарий от emulek

как же вы задолбали со своими конвейерами…

А что не так с конвейерами-то? У тебя кнопки «|» на клавиатуре нет что ли?

alex_the_v ★★★
()
Ответ на: комментарий от alex_the_v

Бывают клавиатуры, где эта кнопка расположена не на месте. А слева от enter, или рядом с backspace. Ужасно неудобно ее там искать.

Lavos ★★★★★
()
Ответ на: комментарий от Valdor

Нет, ее место справа от правого шифта.

Lavos ★★★★★
()
Ответ на: комментарий от alex_the_v

А что не так с конвейерами-то?

он тут нахер не нужен. И только мешает, т.к. цикл выполняется отдельным процессом. А если там переменные меняются? А если ошибка будет?

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.