Bash, grep, целая строка как переменная

Проблема

Как я могу сохранить целый вывод строки от grep как 1 переменная, не для каждой строки.

Пример (мне нужны всего 3 переменные, целые строки).

user@local:~/bin/kb$ grep -E '##.*bash.*file.*add' bash.kb
## bash, file, add string behind founded string
## bash, files, add string to begin
## bash, file, add comma to end of line except last line
user@local:~/bin/kb$

Но for пример.

user@local:~/bin/kb$ for i in $(grep -E '##.*bash.*file.*add' bash.kb); do echo $i; done
##
bash,
file,
add
string
behind
founded
string
##
bash,
files,
add
string
to
begin
##
bash,
file,
add
comma
to
end
of
line
except
last
line
user@local:~/bin/kb$ 

Мне нужно это (только 3 переменные как целая строка).

1st variable $i[0] = '## bash, file, add string behind founded string'
2nd variable $i[1] = '## bash, files, add string to begin'
3rd variable $i[2] = '## bash, file, add comma to end of line except last line'

Как я могу сделать это?

Спасибо.

1
задан 1 October 2019 в 22:35

1 ответ

Ваша проблема - это

for i in $(grep -E '##.*bash.*file.*add' bash.kb); do echo $i; done

выполняет итерации по разграниченным пробелом словам в выводе команды. Это иногда упоминается как разделение слова или в более общем плане, как разделено + шарик.

Можно считать строки в индексный массив в использовании удара mapfile (или его синоним, readarray). Поскольку mapfile чтения от стандартного входа, замените замену команды $( ... ) с заменой процесса <( ... ):

mapfile -t var < <(grep -E '##.*bash.*file.*add' bash.kb)

Можно получить использование значений "${var[0]}","${var[1]}" и т.д. (массивы основаны на нуле), или цикл по ним всем использование

for i in "${var[@]}"; do echo "$i"; done

Отметьте использование двойных кавычек для предотвращения разделения слова в элементах массива.


Если Вы на самом деле не нуждаетесь в переменных вообще и просто хотите циклично выполниться по строкам вывода команды, то используйте a while цикл вместо a for цикл:

while read -r i; do
  echo "$i"
done < <(grep -E '##.*bash.*file.*add' bash.kb)
1
ответ дан 23 October 2019 в 09:42

Другие вопросы по тегам:

Похожие вопросы: