Escapando * com Expressões Regulares e Grep

4

Eu tenho um arquivo com linhas exclusivas que começam com 2 estrelas (**).

No entanto, quando eu executo um comando grep para

grep \*\* fileName 

Eu obtenho todas as linhas no arquivo. Isso é muito incomum, e o que eu vejo como linhas não correspondentes não contém **.

Como eu escaparia do ** para as linhas corretas serem encontradas?

    
por monksy 17.08.2013 / 03:55

3 respostas

4

Então tente:

egrep "^\*\*" YOUR_FILE

Não se esqueça de usar aspas duplas.

Observação: use egrep em vez de grep .

    
por 17.08.2013 / 04:04
6

Você também pode conseguir a mesma coisa instruindo grep de que a string a ser correspondida é uma string fixa. A mudança para fazer isso é -F ou --fixed-strings .

-F, --fixed-strings
          Interpret  PATTERN  as  a  list of fixed strings, separated by 
          newlines, any of which is to be matched.  (-F is specified by
          POSIX.)

Então, algo assim fará:

$ grep -F "**" somefile.txt

Exemplo

$ cat somefile.txt
** blah
blahblah
** hi

Grepping o arquivo produz isso:

$ grep -F "**" somefile.txt
** blah
** hi
    
por 17.08.2013 / 05:41
5

Em:

grep \*\* fileName

As barras invertidas são usadas para escapar do * no shell (onde * é um operador globbing).

O que o grep recebe como segundo argumento é uma cadeia de dois caracteres: ** .

Como uma expressão regular, isso significa qualquer número (0 ou mais) de caracteres estelares , então basicamente corresponde a todos os lugares, pois também corresponde à string vazia, o que explica porque você obtém todas as linhas do arquivo.

Como * é especial para grep regex , , você precisa escapar também. O melhor é usar aspas simples em vez de barras invertidas para escapar de * para o shell (porque aspas simples são citações de shell strongs que escapam de todos os caracteres, mas o caractere de aspas simples) e usam barras invertidas para escapar de * para grep. Aspas duplas funcionariam bem nessa instância, mas cuidado com o fato de que as barras invertidas ainda são especiais para o shell entre aspas duplas.

Então:

grep '\*\*' somefile.txt

(com * com escape, então eles não são mais operadores de regex, mas considerados como caracteres literais) retornaria as linhas de somefile.txt que contêm uma sequência de caracteres de 2 estrelas. Se você quer que eles sejam encontrados apenas no começo da linha, você precisa usar o operador regex de ancoragem ^ :

grep '^\*\*' somefile.txt

Uma maneira alternativa de * não ser considerada como um operador regex seria usar intervalos de caracteres:

grep '^[*][*]' somefile.txt

Uma maneira alternativa de especificar dois caracteres em estrela é escrevê-lo:

grep '^\*\{2\}' somefile.txt

(onde \{ é outro operador regex) que é mais fácil de ler se você usar expressões regulares estendidas como quando passar a opção -E para grep (evite egrep como não é padrão):

grep -E '^\*{2}' somefile.txt

(em expressões regulares estendidas, { é o operador regex).

    
por 17.08.2013 / 22:22