O grep interpreta \n como um caractere de nova linha. Parece que seu arquivo não tem caracteres de nova linha, tem \ seguido por n . Para procurar por barras invertidas literais, você deve dobrá-las:
$ grep -o '\n[^\]*\n' o.txt
\n29\n
\n3 days\n
\n59\n
\n7 days\n
\n99\n
\n12 days\n
Com o GNU grep, a saída pode ser facilmente limpa para remover o \n :
$ grep -oP '(?<=\n)[^\<>]*(?=\n)' o.txt
29
3 days
59
7 days
99
12 days
Aqui, (?<=\n) é uma afirmação com aspeto visual e (?=\n) é uma afirmação antecipada para exigir que o texto que correspondemos seja rodeado por \n . Enquanto grep retorna correspondências não sobrepostas, uma sutileza aqui é que os look-behinds e look-aheads são não contados para a correspondência. Isso nos deixa com o problema de que o texto que não queremos também está cercado por \n . Por exemplo, em o.txt, os caracteres \n<br/><font style="font-size:smaller;font-weight:normal">\n estão cercados por \n . Para eliminar essas sequências, exigimos que o texto correspondente exclua não apenas \ , mas também < e > .
Se não tivermos o GNU grep, outra opção é usar sed para limpar a saída:
$ grep -o '\n[^\]*\n' o.txt | sed 's/\n//g'
29
3 days
59
7 days
99
12 days
Outra opção é usar o awk:
$ awk '0==NR%2' RS='\\n' o.txt
29
3 days
59
7 days
99
12 days
Aqui, o awk está usando \ seguido por n como o separador de registro e imprimimos apenas os registros pares.