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
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).
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
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. 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, !.
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 .
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
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.
Tags grep text-processing quoting