Como encontrar linhas que começam com **

8

Eu preciso encontrar 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.

(Eu também preciso saber se esta linha termina com ) , mas ainda não tentei isso).

    
por Shar Hunter 23.06.2016 / 20:11

5 respostas

18

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

grep '^\*\*' test.out

Além disso, observe as aspas simples em ' e não as aspas duplas em " para evitar que o shell expanda as coisas

    
por 23.06.2016 / 20:15
7

Como você queria verificar a linha que começa com ** e termina com ) , é possível combinar duas operações grep como essa,

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

Ou com o comando grep único como este,

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

Explicação

  • ^\*\* : linha de correspondência que começa com **
  • .* : corresponde a tudo depois de **
  • \)$ : linha de correspondência que também tem ) no final da linha.
por 23.06.2016 / 20:42
3

Não é o shell

Nenhuma das respostas até agora tocou no problema real. Seria útil explicar porque ele não funciona como esperado.

grep -i "^**" test.out

Porque você citou o padrão para grep , * é não expandido pelo shell. Ele é passado para grep como está. Isso é explicado na página de manual [1] para bash [2] :

Enclosing characters in double quotes preserves the literal value of all characters within the quotes, with the exception of $, ', \, and, when history expansion is enabled, !.

São expressões regulares comuns regulares

Uma expressão regular é um padrão que descreve um conjunto de strings.

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

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

Isso significa que seu padrão, ^** não faz muito sentido. Possivelmente, ele tenta corresponder ao início da linha zero ou mais vezes , duas vezes. O que quer que isso signifique.

A solução é citá-lo :

Any meta-character with special meaning may be quoted by preceding it with a backslash.

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

[1] Eu não recomendo lê-lo. Por favor use man dash ou similar.

[2] Nenhum shell foi dado, então eu assumo bash .

    
por 24.06.2016 / 03:10
2

Outras opções.

Você pode usar sed ou awk também

$ sed -n '/^*\*/p' test.out
$ awk '/^*\*/' test.out

Para saber as linhas que terminam com ) , use também grep ou sed ou awk

$ grep ')$' test.out
$ sed -n '/)$/p' test.out
$ awk '/)$/' test.out
    
por 23.06.2016 / 20:29
0

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

Isso funciona desde que você não tenha arquivos no diretório que comece com ^\ e contenha outra barra invertida.

    
por 24.06.2016 / 13:54