Предполагая, что значения находятся внутри файла, с pcre grep:
$ grep -P '(([0-9a-f]+)\.)(?1)+(?2)' file
9.0.8.2c
8.1.3.9b
Или с перлом:
perl -lne '/((([\da-f]+)\.)(?2)+(?3))/;print $1' file
ОП также хочет видеть вывод, поэтому нам нужен небольшой скрипт
#!/bin/bash
exec 3>&1 # Make a copy of the stdout fd on fd 3
while "/Applications/Adobe After Effects 2020/aerender" -project "/Volumes/Videos/Test.aep" -sound ON |
tee /dev/fd/3 |
grep 'WARNING:After Effects warning' >/dev/null
do
echo "Repeating the command"
done
Здесь происходит несколько вещей, и я делаю предположение о том, что поддерживается на macos. exec
делает fd 3 таким же, как стандартный вывод скрипта. Я надеюсь, что macos сделает это доступным как /dev/fd/3. tee
используется для отправки копии вывода aerender на this, поэтому скрипт выводит то же самое, что и исходный код.
Затем выходные данные tee передаются в grep. Я намеренно не использую grep -q
, так как это может остановить обработку, как только он увидит первый соответствующий шаблон, что может привести к тому, что tee
получит SIGPIPE, что может привести к тому, что aerender получит SIGPIPE. Если aerender не создает много вывода и выводит сообщение только один раз, это делает его слишком осторожным, но это не повредит.
Если macos не поддерживает /dev/fd/3, можно попробовать
#!/bin/bash
while O="$("/Applications/Adobe After Effects 2020/aerender" -project "/Volumes/Videos/Test.aep" -sound ON)"
echo "$O"
echo "$O" | grep 'WARNING:After Effects warning' >/dev/null
do
echo "Repeating the command"
done
Недостаток этого заключается в том, что будут выводиться все stderr aerender, а затем будут выводиться все stdout, а не в ожидаемом чередующемся режиме.
Все это не проверено, так как у меня нет подходящей системы, чтобы попробовать.