Подтвердить что ты не робот

Как назначить вывод команды в массив?

Мне нужно назначить результаты из grep в массив... например

grep -n "search term" file.txt | sed 's/:.*//'

Это привело к появлению ряда строк с номерами строк, в которых был найден поисковый запрос.

1
3
12
19

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

4b9b3361

Ответ 1

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

arr=( $(command) )

В примере OP это будет выглядеть так:

arr=($(grep -n "search term" file.txt | sed 's/:.*//'))

Внутренний $() запускает команду, в то время как external () заставляет вывод быть массивом. Проблема заключается в том, что он не будет работать, если выходные данные команды содержат пробелы. Чтобы справиться с этим, вы можете установить IFS на \n.

IFS=$'\n'
arr=($(grep -n "search term" file.txt | sed 's/:.*//'))
unset IFS

Вы также можете исключить необходимость использования sed, выполнив расширение для каждого элемента массива:

arr=($(grep -n "search term" file.txt))
arr=("${arr[@]%%:*}")

Ответ 2

Строки, разделенные пробелами, легко пересекаются в bash.

# save the ouput
output=$(grep -n "search term" file.txt | sed 's/:.*//')

# iterating by for.
for x in $output; do echo $x; done;

# awk
echo $out | awk '{for(i=1;i<=NF;i++) print $i;}'

# convert to an array
ar=($out)
echo ${ar[3]} # echos 4th element

если вы думаете о пространстве в имени файла, используйте find . -printf "\"%p\"\n"