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