
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 grep
operações como esta,
grep '^*\*' test.out | grep ')$'
Ou com um único grep
comando 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 dash
ou 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.