Grep com ERE não filtra linhas com opção -v

2

Estou tentando usar a opção regex estendida no grep para filtrar os arquivos, linhas com o seguinte formato de string no início da linha.

any-non-space-char:      *

Eu supus que o seguinte comando iria fazer o truque; no entanto, apenas imprimiu todas as linhas dos 2 arquivos que foram capturados pelo caractere curinga.


~/tmp > cat * | grep -v -E "^\S+:.{6}\*"
hi
test1      blah, blah, blah:      * blah, blah, blah"
test:      * blah, blah, blah:      * blah, blah, blah
sd
hi
temp:      * blah, blah, blah:      * blah, blah, blah"
temp2:     blah, blah, blah:      * blah, blah, blah
sd
~/tmp >

BTW, eu alias o grep para 'grep --color=auto' , então o comando destaca as strings correspondentes conforme o regex corretamente, que são test: * na linha 3 e temp: * na linha 6 na saída acima. No entanto, essas linhas correspondentes são impressas na tela, o que eu não esperava.

O conteúdo dos dois arquivos:


~/tmp > ls -l
total 8
-rw-rw-r-- 1 pmn ccusers 116 Dec 11 09:22 1
-rw-rw-r-- 1 pmn ccusers 116 Dec 11 09:23 2
~/tmp >

~/tmp > cat 1
hi
test1      blah, blah, blah:      * blah, blah, blah"
test:      * blah, blah, blah:      * blah, blah, blah
sd
~/tmp >

~/tmp > cat 2
hi
temp:      * blah, blah, blah:      * blah, blah, blah"
temp2:     blah, blah, blah:      * blah, blah, blah
sd
~/tmp >

BTW, o seguinte é semelhante ao que espero:


~/tmp > cat * | grep -v -E ":.{6}*"
hi
sd
hi
sd
~/tmp >

Que removeu as linhas


test1      blah, blah, blah:      * blah, blah, blah"
test:      * blah, blah, blah:      * blah, blah, blah
temp:      * blah, blah, blah:      * blah, blah, blah"
temp2:     blah, blah, blah:      * blah, blah, blah

(também removeu as linhas 1 e 4 acima, o que não é o que eu quero - portanto, este comando grep não funciona para mim).

Eu sei como fazer isso funcionar no PERL; no entanto, por certas razões, posso usar apenas grep, awk ou sed.

Como faço para que isso funcione?

@PsychoData

Obrigado pela sua resposta. Temo que o comando não tenha feito o truque. Seu comando retornou o seguinte

~/tmp > cat * | grep -v -E "^[^\S]+:.{6}\*"  
hi  
sd  
hi  
sd  
~/tmp >

que é o mesmo que o resultado retornado por grep -v -E ":.{6}*" na minha pergunta, que, no entanto, não é o que eu queria. Eu queria um comando para trazer a seguinte saída:

hi  
test1      blah, blah, blah:      * blah, blah, blah"  
sd  
hi  
temp2:     blah, blah, blah:      * blah, blah, blah  
sd

IMHO, o seu removeu as linhas a seguir porque ^[^\S]+: faz uma correspondência ambiciosa, correspondendo o máximo possível à linha - que, como você pode ver, é até a mais direita ' * ' nas linhas a seguir.

test1      blah, blah, blah:      * blah, blah, blah"  
test:      * blah, blah, blah:      * blah, blah, blah  
temp:      * blah, blah, blah:      * blah, blah, blah"  
temp2:     blah, blah, blah:      * blah, blah, blah

BTW, observe que há exatamente 6 espaços entre cada par : e * . Acho que a formatação dificulta isso.

    
por pmn 11.12.2013 / 00:10

2 respostas

1

tente grep -v -E "^[^\S]+:.{6}\*"

Ok. Então, o que estou fazendo com isso é dizer que eu quero cada linha que não contenha o seguinte padrão e ativar expressões estendidas:

match the start of a line, then [anything EXCEPT whitespace] at least once,then a colon, then 6 characters, then an asterisk

qualquer coisa que não corresponda a esse padrão será mostrada

    
por 11.12.2013 / 01:00
1

Não há como fazer uma correspondência não-gulosa em expressões regulares estendidas. Você pode, no entanto, fazê-lo facilmente com PCREs :

$ grep -hvP "^[^\s]+?:\s+\*" *
hi
test1      blah, blah, blah:      * blah, blah, blah"
sd
hi
temp2:     blah, blah, blah:      * blah, blah, blah
sd

Você não precisa cat dos arquivos, grep pode abri-los diretamente. A opção -h vira a impressão do nome do arquivo (necessário quando não cat ing) e o -P ativa os PCREs. Em seguida, você procura por um ou mais caracteres não espaciais no início da linha ^[^\s]+? , seguido por : , um ou mais espaços ( \s+ ) e finalmente * (você precisa escapar da * else é tratado como um quantificador).

    
por 06.01.2014 / 12:42