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.
#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?
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
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
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}'