grep e abas: sem correspondência

2
#cat sample
1   -1  2
2   2   2
2   1-1 3

Eu preciso obter todas as linhas que contenham valor negativo, isto é, somente linha 1. Os valores são separados por tabulações. Primeiro eu tentei

# grep "\-1" sample
1   -1  2
2   1-1 3

Mas se eu tentar

 grep "\t\-1" sample

Eu não recebo nada (sem correspondência). O que estou fazendo errado?

    
por Putnik 19.01.2012 / 15:25

4 respostas

3

No Bash, você pode fazer isso:

grep $'\t-1' sample

O $'' faz com que as fugas sejam interpretadas.

Não é necessário escapar do sinal de menos.

    
por 19.01.2012 / 17:14
1

Tente algo como:

grep -P '\t-1' sample

A propósito, a amostra que você forneceu é indentada por tabulação. Você pode tentar o seguinte para correspondência de espaço em branco genérico:

grep -P '\s-1' sample
    
por 19.01.2012 / 15:32
1

Não há nenhuma facilidade para ser tab em expressões regulares básicas (aquelas descritas por man 7 regex ). Como Georgi Hristozov apontou, você pode usar expressões regulares compatíveis com Perl para obter essa habilidade. Algumas implementações do grep não suportam -P, mas outras ferramentas básicas terão linguagens de expressões regulares mais ricas, aqui estão alguns exemplos que devem funcionar:

sed -n '/\t-/p' sample
awk '/\t-/' sample
perl -ne '/\t-/ && print' sample

Para fazê-lo funcionar com o grep normal (sem usar o pcre), você terá que colocar uma expressão de tabulação literal na sua regex. Em muitos shells em que a tecla tab faz algo como a conclusão, você pode obter um caractere de tabulação literal com Ctrl-v<tab> . então você digitaria:

grep 'Ctrl-v<tab>-' sample
    
por 19.01.2012 / 16:01
1

Verifique man 7 regex para as expressões regulares POSIX que você pode usar, enquanto -P para PCRE é suportado em muitos lugares não está disponível em todos os lugares (e a página de manual diz seu buggy para que eu nem sempre confie em mim) Os POSIX devem funcionar em mais lugares.

Você pode tentar algo assim:

grep "^[[:digit:]]\+[[:space:]]\+-"

^ corresponde ao início da linha.
[[:digit:]]\+ corresponde a um ou mais dígitos.
[[:space:]]\+ corresponde a um ou mais caracteres de espaços em branco.
- finalmente corresponde ao valor negativo que você estavam procurando.

Página de manual para regex (7): link

Solução opcional :

Você pode usar o awk para fazer isso também (e certamente outras ferramentas). Este é um exemplo de awk que imprime linhas onde a segunda coluna é menor que 0 (negativo):

awk '{if ($2 < 0) print}'
    
por 19.01.2012 / 17:48

Tags