Como encontrar linhas que começam com **

Como encontrar linhas que começam com **

Preciso descobrir se alguma linha em um arquivo começa com **.

Não consigo descobrir como fazer isso porque *é interpretado como um curinga pelo shell.

grep -i "^2" test.out

funciona se a linha começar com 2, mas

grep -i "^**" test.out 

obviamente não funciona.

(Também preciso saber se esta linha termina com a, )mas ainda não tentei).

Responder1

Use o \caractere para escapar do * para torná-lo um caractere normal.

grep '^\*\*' test.out

Observe também as aspas simples 'e não aspas duplas "para evitar que o shell expanda as coisas

Responder2

Como você queria verificar a linha que começa **e termina com ), você pode combinar duas grepoperações como esta,

grep '^*\*' test.out | grep ')$'

Ou com um único grepcomando como este,

grep -E '^\*\*.*\)$' test.out

Explicação

  • ^\*\*: linha de correspondência que começa com**
  • .*: combine tudo depois**
  • \)$: linha de correspondência que também possui )no final da linha.

Responder3

Não é a casca

Nenhuma das respostas até agora tocou no problema real. Seria útil explicarpor quenão funciona como você espera.

grep -i "^**" test.out

Porque você temcitadoo padrão paragrep, *énãoexpandido pela casca. É passado paragrepcomo é. Isso é explicado na página de manual [1] parafesta[2] :

Colocar caracteres entre aspas duplas preserva o valor literal de todos os caracteres entre aspas, com exceção de $, `, \ e, quando a expansão do histórico está habilitada, !.

São expressões regulares ordinárias regulares

Uma expressão regular é umpadrãoque descreve um conjunto de strings.

*é um dos principais padrões em expressões regulares. Por padrão,grepinterpreta da seguinte forma:

* The preceding item will be matched zero or more times.

Isso significa que o seu padrão, tal como está, ^**não faz muito sentido. Possivelmente tenta coincidir com o início da linhazero ou mais vezes, duas vezes. Seja lá o que isso signifique.

A solução écitaristo:

Qualquer metacaractere com significado especial pode ser citado precedendo-o com uma barra invertida.

grep -i "^\*\*" test.out


[1] Não recomendo a leitura. Por favor, use man dashou similar.

[2] Nenhuma concha foi dada, então presumofesta.

Responder4

Esta é a versão completamente sem aspas: grep ^\\*\\* test.out. Para passar uma barra invertida literal do shell para o grep, ela precisa ter escape.

Isso funciona desde que você não tenha arquivos no diretório começando ^\e contendo outra barra invertida.

informação relacionada