Как повторить команду при наличии определенной строки в файле?

На основании того факта, что входные данные содержат двойные пробелы между словами, существует гораздо более простое решение. Вы просто заменяете двойные пробелы на неиспользуемый символ, удаляете пробелы и заменяете неиспользованный символ пробелом:

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:

Книга также имеет более важную аналитическую цель

2
29.04.2017, 13:55
2 ответа

Найти строку в файле:

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

В противном случае вам нужно будет повторить команду перед циклом и внутри него.

3
27.01.2020, 21:52

Обратите внимание, что в 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).

4
27.01.2020, 21:52

Теги

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