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.