Como extrair a string entre dois \ n em um arquivo

7

Eu tenho um arquivo com padrão

    <span class="WebRupee">Rs.</span>\n29\n<br/><font style="font-size:smaller;font-weight:normal">\n3 days\n</font></td>, <td class="pricecell"><span class="WebRupee">Rs.</span>\n59\n<br/><font style="font-size:smaller;font-weight:normal">\n7 days\n</font></td>, <td class="pricecell"><span class="WebRupee">Rs.</span>\n99\n<br/><font style="font-size:smaller;font-weight:normal">\n12 days\n</font></td>

Eu quero os valores 29, 3 dias, 59 etc.

basicamente o valor entre \n value \n

Eu consultei muitos lugares, mas não sei como escapar dos \ n caracteres.

Eu tentei: - grep -o '\n.*\n' o.txt Mas não deu certo

    
por penta 23.07.2016 / 22:44

1 resposta

9

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.

    
por 23.07.2016 / 22:57