Intereting Posts
HDMI не обнаружен `xrandr` Тестирование, из сценария, если звуковые устройства молчат? Может ли веб-сервер Apache отвечать на запросы SMTP / IMAP / POP3? Короткое чтение при попытке открыть / dev / sda2 Как измерить общий дисковый ввод-вывод в час Устройство Pcie 1.1 не обнаружено в слоте pcie gen 3 Как загрузить все изображения из темы форума с помощью wget Кукольный: не удалось запросить сертификат Как показать только короткую раскладку клавиатуры в i3blocks с помощью kbdd_layout? Существует ли обратная команда разреза? Отправлять журналы на несколько серверов syslog Как приостановить перечисление длинного текстового файла с кошкой в ​​командной строке после 10 строк, затем нажмите любую клавишу Почему дескриптор dm-crypt не обрабатывает барьеры должным образом? Скрипт для изменения частоты обновления монитора при полноэкранном режиме на определенном веб-сайте. Количество ссылок для папки не отражает реальный статус?

Сохранить результат grep для массива

Я хочу сохранить все имена файлов, которые соответствуют шаблону в массиве bash.

Мое решение не работает. Я думаю, что проблема связана с использованием труб, но я не знаю, как это исправить.

i=0 find . -type f | grep -oP "some pattern" | while read -r line; do arr[$i]=$line; let i=i+1; done 

С bash-4.4 и выше вы будете использовать:

 readarray -d '' -t arr < <( find . -type f -print0 | grep -zP 'some pattern') 

С более старыми версиями bash :

 arr=() while IFS= read -rd '' file; do arr+=("$file") done < <(find . -type f -print0 | grep -zP 'some pattern') 

Или (чтобы быть совместимым даже с более старыми версиями bash , у которых не было синтаксиса arr+=() zsh):

 arr=() i=0 while IFS= read -rd '' file; do arr[i++]=$line done < <(find . -type f | grep -zP 'some pattern') 

У вашего подхода есть несколько проблем:

  • с -o , grep только печатает части записей, которые соответствуют шаблону, в отличие от полной записи. Вы не хотите этого здесь.
  • вывод по умолчанию, выводимый по умолчанию, не может быть отправлен после обработки, поскольку символ новой строки является таким же допустимым, как и любой в пути к файлу. Вам нужен вывод с -print0 ограничением (так что -print0 в find и -z в grep для обработки записей с -print0 ограничением.
  • вы также забыли пропустить IFS= read .
  • в bash и без опции lastpipe последняя часть линии трубопровода выполняется в подоболочке, так что там вы только обновляете $arr этой подоболочки.