На основании того факта, что входные данные содержат двойные пробелы между словами, существует гораздо более простое решение. Вы просто заменяете двойные пробелы на неиспользуемый символ, удаляете пробелы и заменяете неиспользованный символ пробелом:
echo "T h e b o o k a l s o h a s a n a n a l y t i c a l p u r p o s e w h i c h i s m o r e i m p o r t a n t " | sed 's/ /\-/g;s/ //g;s/\-/ /g'
... output:
Книга также имеет более важную аналитическую цель
Найти строку в файле:
grep -q string file
Выходное значение сообщает вам, найден ли grep что-либо.
Затем вы можете зацикливаться, пока команда возвращает истинное значение выхода:
while command ; do
repeat this
done
Хотя вы хотите запустить команду хотя бы один раз, возможно,
while true ; do
some command
if ! grep -q string file ; then
break # jump out of the loop if it's _not_ there
fi
done
В противном случае вам нужно будет повторить команду перед циклом и внутри него.
Обратите внимание, что в while-cmd-list; сделать do-cmd-список; done
, в то время как-cmd-list
это также список команд. Это не обязательно должна быть одна команда.
Итак, вы можете сделать:
while
gksu ./installer.run > ./inst.log 2>&1
grep -q string inst.log
do
echo >&2 "Trying again, output contained string"
done
Хотя здесь вы также можете сделать:
while
gksu ./installer.run 2>&1 |
tee ./inst.log |
grep string > /dev/null
do
echo >&2 "Trying again, output contained string"
done
(обратите внимание, что мы не используем -q
, так как это будет означать grep
может завершиться досрочно, что приведет к получению установщиком SIGPIPE).