У меня есть ранее запущенная команда $cmd
, эта команда выводит несколько строк.
Я хотел бы взять nth
строку вывода при запуске отредактированной версии $cmd
.
До сих пор я пробовал:
local -a lines
for line in $(eval "$(some_edit $cmd)");do
lines+=("$line")
done
echo "${lines[$nth_line]}"
Я всегда echo
все, когда $nth_line
равно 1
и ничего для больших целых чисел.
У меня всегда есть $lines
массив из одной строки, то есть всех строк.
Я пробовал комбинации "
, но безрезультатно.
... | awk NR==$nth_line
?
Я не знаю, правильно ли я вас понял - вы имеете в виду что-то подобное?
#!/bin/bash
cmd = "./script.sh"
# read stdout from $cmd into array lines
readarray lines < <($cmd)
# edit the second line
lines[1]=$'version: 0.99\n'
# loop over array and print lines
for line in "${lines[@]}"; do
printf "%s" "$line"
done
тестовый скрипт для имитации $cmd
#!/bin/bash
echo "start"
echo
echo "do something"
echo
echo "end"
выход
start
version: 0.99
do something
end
в то время как вы наверняка услышите «не используйте eval», кроме того, мы не можем сказать, что вы вводите и каковы ожидаемые результаты. Пожалуйста, отредактируйте свой вопрос, включив в него несколько примеров неудачных входных данных и точный результат, который вы получите. Удачи.