Как сохранить каждую отдельную строку в текстовом файле в массив?

У меня есть файл под названием «threewords». Он содержит информацию:

\#gray speedy bee gr-A | sp-EdE | bE \#gray greedy pea gr-A | gr-EdE | pE 

Когда я запускаю команду:

 cat threewords | grep ^# | cut -c2- 

Команда вытягивает две строки, начинающиеся с #. Затем он удаляет # и возвращает это как вывод:

 gray speedy bee gray greedy pea 

Когда я выполняю свою команду:

 array=($(cat threewords | grep ^# | cut -c2-)) 

Он создает массив, но он разделяет все слова на отдельные позиции массива следующим образом:

 array[0] = gray, array[1] = speedy, array[2] = bee, array[3] = gray, array[4] = greedy, array[5] = pea 

Я могу вычислить код, чтобы он помещал вывод каждой строки в массив следующим образом:

 array[0] = gray speedy bee, array[1] = gray greedy pea 

2 Solutions collect form web for “Как сохранить каждую отдельную строку в текстовом файле в массив?”

Разделение выполняется с IFS как разделителем (который по умолчанию содержит пробел, новую строку и вкладку). Установите IFS только в новую строку:

 $ IFS=$'\n' a=($(printf "1 2\n2 3\n")) $ echo ${a[0]} 1 2 $ echo ${a[1]} 2 3 

Это изменит IFS для оболочки, поэтому лучше всего сохранить ее и восстановить:

 OLD_IFS="$IFS" IFS=$'\n' array=($(grep '^#' threewords | cut -c2-)) IFS="$OLD_IFS" 

И нет абсолютно никаких оснований:

 cat threewords | grep '^#' 

grep отлично умеет читать файлы:

 grep '^#' threewords 

Как отмечает Стефан , при обработке вывода команды для дальнейшего расширения оболочки следует отключить глобальное использование с помощью set -f :

 $ help set ... -f Disable file name generation (globbing). 

В противном случае:

 $ cd /; a=( $(printf "*\n") ) $ echo ${a[@]} bin boot cdrom dev etc home ... 

Если у вас есть bash 4

 mapfile -t array < <(grep ^# threewords | cut -c2-) 

Будет заполнять array , по одной строке на элемент

 printf "%s\n" "${array[@]}" gray speedy bee gray greedy pea 
  • Как получить FreeBSD Grep для распознавания опции «-»?
  • Как сделать grep в реальном журнале (stdout)?
  • Почему эта команда не работает: «ps aux | grep xscreensaver "
  • grep для заглавных слов
  • Как grep слово после / summary / в переменной и хранить слово в новой переменной в сценарии bash
  • Помощь с модификацией команды
  • Сравните два текстовых файла и найдите соответствующие строки
  • Я хотел бы grep все файлы, кроме некоторых типов файлов?
  • Является ли -r обязательным для grep?
  • копирование и работа с файлами (папками) OSX .app в linux
  • Соответствующая ячейка Grep файла csv и индекс этой строки
  • Interesting Posts

    Строка Grep с определенным словом из файла в определенном столбце

    Должен ли я проверить версию bash?

    Поиск каталогов без музыкальных файлов

    Как преобразовать беззнаковое десятичное число (менее 1 << 32) в 4 байта (двоичное) в bash?

    Я только что создал гибрид Debian / Kali? И я должен волноваться?

    CentOS 6 в слиянии VMWare: Неожиданное изменение MAC-адреса

    Какой сценарий из /etc/init.d/ начал процесс?

    Фоновая и передняя задача и выполнение задач параллельно

    Нерестовые процессы в стеке работ

    Почему этот перерыв не может избавить меня от этого цикла while-do?

    Можно ли использовать VMWare VDI в качестве прокси для SSH?

    mv с функциональностью rsync

    Смущенный разным выходом из iptables -L

    apt-get скрипт для обновления обновления dist-upgrade clean и autoremove

    как я могу использовать bash в качестве моей оболочки входа, когда мой системный администратор отказывается позволить мне изменить его

    Linux и Unix - лучшая ОС в мире.