Nota. Esta é uma pergunta para minha própria pergunta
O método a seguir funciona muito bem. Ele envia uma série de teclas pressionadas para o mplayer (o mplayer registra esses pressionamentos de tecla inválidos). Cada tecla pressionada é escolhida para representar um dígito decimal, por exemplo. O envio de F2 F5 F7
representa o número decimal 257
. O envio de um número de 6 dígitos demora cerca de 0,2 seg. O registro de data e hora é retirado da linha de registro imediatamente antes da primeira pressão (cabeçalho). Isso evita todos os problemas atendidos com atrasos de caching, como mencionado na resposta Gilles '.
Ele pode ser executado facilmente a partir de emacs
movendo apenas point
(cursor) para outra linha ou pressionando uma tecla específica (esse código não está aqui, mas eu esperaria que fosse simples o suficiente) sou novo para elisp) .Aqui está a solução codificada e testada em alfa ...
# Insert a number (input to this script) into mplayer's log;
# Each digit of the input number is translated into
# a key-press for which mplayer does not have a binding.
# mplayer makes a log entry for each invalid key-press.
# The log entry identifies the key, so the entry can be
# translated back into its original decimal value
#
# A leading and a trailing marker are also sent to mplayer
#
# A simple parsing of the log can rebuild the original
# number and the time within the media stream when it occurred.
#
num=${1:-123456} # Default if for testing only
shopt -s extglob # For splitting the input number
# Window ID ($2) Defaults to win whose title == $USER@$HOSTNAME.*
win=${2:-$(($(wmctrl -l | sed -nr "s/^([^ ]+).* $USER@$HOSTNAME.*//p")))}
# ========== ===== === # Key-press translation array
# 0123456789 begin end # decimal digits and delimiters
key=(F12 F{1..9} c \') # key names
# ========== ===== === #
xdotool key --window $win ${key[10]} # HEAD Marker
for i in ${num//?(.)/ } ;do
xdotool key --window $win ${key[i]} # Encoded decimal digit
done
xdotool type --window $win ${key[11]} # TAIL Marker
Aqui está um processo de acompanhamento de 3 etapas para extrair o registro de data e hora e o número (número da linha ou byte / char offset no texto de origem) ...
# (1) Each line of mplayer's normal output (vs errors) ends
# witn '\x1B\[J\x0D'. First, convertd this to '\n'
sed -nr 's/\x1B\[J\x0D/\n/gp' mplayer.log >/dev/null
# (2) The above pre-processing step(1) can be piped to the next sed step,
# but I've redirected it to /dev/nul for this example
# The following step works with a few lines of the pre-processed log
nbfk="No bind found for key"
sed -nr "
/^$nbfk 'c'\./,/^$nbfk '''\./{
/^$nbfk 'c'\./{g # HEAD Marker found
s/^A: *([0-9.]+).*/000000/
s/^0*([0-9]{6}\..*)/T:/p
}
s/^$nbfk 'F12'\..*/0/p # Digit
s/^$nbfk 'F([1-9])'\..*//p # Digit
s/^$nbfk '''\..*/--/p # TAIL Marker found
}
h" <<'EOF'
A: 18.6 (18.6) of 3207.0 (53:27.0) 0.1%
A: 18.7 (18.6) of 3207.0 (53:27.0) 0.1%
No bind found for key 'c'.
A: 18.7 (18.6) of 3207.0 (53:27.0) 0.1%
No bind found for key 'F1'.
A: 18.7 (18.7) of 3207.0 (53:27.0) 1.0%
No bind found for key 'F2'.
A: 18.7 (18.7) of 3207.0 (53:27.0) 0.1%
A: 18.8 (18.7) of 3207.0 (53:27.0) 0.1%
No bind found for key 'F3'.
A: 18.8 (18.8) of 3207.0 (53:27.0) 0.1%
No bind found for key 'F4'.
A: 18.8 (18.8) of 3207.0 (53:27.0) 0.1%
No bind found for key 'F5'.
A: 18.9 (18.8) of 3207.0 (53:27.0) 0.1%
No bind found for key 'F6'.
A: 18.9 (18.8) of 3207.0 (53:27.0) 0.1%
No bind found for key '''.
A: 18.9 (18.9) of 3207.0 (53:27.0) 0.1%
A: 19.0 (18.9) of 3207.0 (53:27.0) 0.1%
EOF
# (3) The above step(2) can be piped to the next sed step,
# but I've let it go to stdout for this example
# The following example step works with output of step (2)
sed -nr "
/^T:[0-9.]+$/,/^--$/{
/^T:[0-9.]+$/{ s/^T:(.*)/ /; h}
/^[0-9]$/H
/^--$/{g; s/\n//g; p}
}" <<'EOF'
T:000018.7
1
2
3
4
5
6
--
EOF
Aqui está a saída final: time in seconds
e o teste line number
000018.7 123456