Confuso sobre grep inverso

1

Então, quando você usa o inverso no grep ( egrep -v ), isso significa literalmente que a saída é mostrada de cabeça para baixo (invertida)?

Acho que fiquei mais confuso quando vi os exemplos a seguir

$ egrep -v '\ ' blah.sh
$ egrep -v '(\ )|^$' blah.sh

Estou confuso sobre o que '\' faz e o que acontece se você colocar -v. Além disso, qual é a diferença entre o comando '\' e '(\)' se estamos excluindo | ^ $ comando?

    
por user36683 07.04.2013 / 03:14

2 respostas

4

Como vonbrand disse, -v significa linhas de impressão que não correspondem ao padrão. Isso é melhor explicado pelo exemplo. Digamos que eu tenha um arquivo chamado foo.txt cujo conteúdo é:

aaa
bbb
aabb

Então, vamos grep para algumas strings no arquivo:

$ egrep 'a' foo.txt ## print lines that contain 'a'
aaa
aabb
$ egrep -v 'a' foo.txt  ## print lines that do not contain 'a'
bbb

Agora, os regexes específicos que você postou realmente não fazem muito sentido sozinhos. Onde você achou eles? De qualquer forma, em muitos sabores de expressões regulares, \ escapa o próximo caractere, '\' é uma maneira de digitar um espaço em muitas conchas. Isso não é necessário ao usar o GNU grep , mas '\ ' significa procurar por espaços. Por exemplo:

$ cat foo.txt
aaa
bb cc
$ grep '\ ' foo.txt
bb cc
$ grep ' ' foo.txt # same as the previous one, at least for GNU grep
bb cc
$ grep -v '\ ' foo.txt # print lines that do not contain spaces
aaa

| significa OR lógico, ^ corresponde ao início de uma cadeia e $ corresponde ao final. Portanto, \ |^$ corresponderá a qualquer linha que contenha pelo menos um espaço ou uma linha vazia:

$ cat foo.txt
aaa

bbb
cc dd
$ egrep '\ |^$' foo.txt # print lines that are either empty, or have spaces

dd ee
$ egrep -v '\ |^$' foo.txt # print lines that are neither empty, nor have spaces
aaa 
bbb

Os parênteses permitem que você capture um padrão:

   Back References and Subexpressions
       The back-reference \n, where n is a single digit, matches  the
       substring   previously   matched   by  the  nth  parenthesized
       subexpression of the regular expression.

Eles não estão fazendo nada útil na expressão regular que você postou. Um exemplo de seu uso seria:

$ cat foo.txt
aaaa
aa bb

aabbccbb
$ egrep '(bb)..' foo.txt  
aabbccbb

A expressão regular (bb).. significa corresponder à string bb , quaisquer dois caracteres ( .. ) e, em seguida, a string bb novamente ( ).

    
por 07.04.2013 / 05:29
1

grep pattern file(s) mostra as linhas que correspondem a pattern ; grep -v pattern file(s) mostra as linhas que não correspondem ao padrão. Se você mesclar as saídas de ambos na ordem correta, obterá o file(s) de volta.

    
por 07.04.2013 / 03:17

Tags