Фрагмент 2 ближе всего. dialog --gauge
опционально будет искать магический маркер XXX
во входных данных, а затем считывать новый процент из следующей строки и новое приглашение из строк после нее до нового маркера.
Таким образом, вы должны получить то, что хотите,:
HandBrakeCLI --preset "Normal" -i "$f" -o "$DEST_FULL_FILE" |
stdbuf -oL tr -s '\r' '\n' |
while read -r str
do
REMAINING=$(echo "$str" | grep -oP "(?<=ETA )\d\dh\d\dm\d\ds(?=\))")
PROGRESS=$(echo "$str" | grep -oP "(?<=, )\d+(?=.\d\d)")
echo -e "XXX\n$PROGRESS\n$DIALOG_MSG Time remaining: $REMAINING\nXXX"
done |
dialog --gauge "$DIALOG_MSG Time remaining: " 10 70;
Вам нужна строчная -опция d версии GNU.
# printf "a\na\na\nb\nb\nc\n" | uniq -d
a
b
С помощью GNU или ast -открыть реализациюuniq
:
uniq -D -u < input
(-D
сам по себе не является -стандартным ), хотя обратите внимание, что он удаляет последний дубликат, а не первый (, что имеет значение, если вы также используете -i
, -w
или -f
)
Переносимо, вы всегда можете использоватьawk
:
awk 'NR > 1 && $0 "" == previous ""; {previous = $0}' < input
(объединение с ""
для принудительного сравнения строк, даже если операнды выглядят как числа)
Для сравнения только первых 9 символов (обратите внимание, что -w
также является расширением GNU, и (в настоящее время )работает с байтами, а не с символами (, несмотря на то, что написано в его документе)):
awk '{current = substr($0, 1, 9)}
NR > 1 && current == previous
{previous = current}' < input
(в этом случае конкатенация ""
не требуется, так как substr()
возвращает строку ).
В локали UTF -8, на выходе
printf '%s\n' StéphaneChazelas StéphaneUNIX StéphaneUnix
Это дает StéphaneUnix
, как и ожидалось, в то время какuniq -w9 -D -u
(с GNUuniq
)дает StéphaneChazelas
и StéphaneUNIX
, поскольку Stéphane
составляет 8 символов, но 9 байтов в UTF -8, в то время как ast -open uniq
дает StéphaneUNIX только(awk
пропускает первое вхождение, uniq
удаляет последнее вхождение ).
С awk
,вы также можете сообщить обо всех повторяющихся строках, даже если они не соседствуют с:
awk 'seen[$0]++' < input
(обратите внимание, что он сохраняет все уникальные строки в памяти в хэш-таблице, хотя ).
Или учитывать только первые 9 символов:
awk 'seen[substr($0, 1, 9)]++' < input
Решение состоит в том, чтобы использовать -c
uniq, а после удалить то, что вы хотите
e444$ ( echo a ; echo a ; echo b ; echo d ; echo d ; echo e ) | uniq -c
2 a
1 b
2 d
1 e
a
и d
дублируются, а b
и e
дублируются
e444$ ( echo a ; echo a ; echo b ; echo d ; echo d ; echo e ) | uniq -c \
| sed -E '/^ *1.$/d;s/^ *[0-9]+ //'
объяснение выражения sed
:
/^ *1.$/d
удалит все уникальные строки
s/^ *[0-9]+ //
удалит счетчик