O que faz um “*” no início de uma expressão regular?

0

Neste caso discutido: encontrar (GNU findutils) 4.5.11 grep (GNU grep) 2.20

Digamos que eu tenha um diretório que contenha vários arquivos. Eu quero encontrar os arquivos chamados jtobdops02.key e jtobdops.02.cer.

find . -regextype posix-extended -regex ".*jtobdops02\.(key|cer)"

Dá:

./certs/jtobdops02.key

./certs/jtobdops02.cer

find . -type f | grep -E '.*jtobdops02.*(key|cer)'

Também dá como esperado:

./certs/jtobdops02.key

./certs/jtobdops02.cer

Ainda

find . -type f | grep -E '*jtobdops02.*(key|cer)'

Dá isto:

./certs/ jtobdops02.key

./certs/ jtobdops02.cer

O homem para encontrar estados:

This is a match on the whole path, not a search.

O homem do grep declara:

grep, egrep, fgrep - print lines matching a pattern

Se ambos combinam, não pesquisam, por que o último grep ainda funciona? Também neste último caso não há nenhuma sub-expressão precedente para o grep corresponder, então o que o * corresponde neste caso? A saída colorida (negrito) não mostra diferença, então presumo que não faça nada. Não deveria dar erro neste caso?

Qual delas é a idiossincrasia e qual delas é uma prática geral em outras ferramentas e idiomas?

    
por user128083 18.03.2016 / 01:18

1 resposta

0

Uma expressão regular estendida começando com * produzirá um resultado indefinido , de acordo com o padrão POSIX .

Isto é com grep no OpenBSD 6.4:

$ grep -E '*hello'
grep: repetition-operator operand invalid

O GNU grep parece ignorar totalmente o * :

$ printf 'hello\n' | ggrep -E '*hello'
hello

De acordo com o mesmo padrão , se você usar expressões regulares básicas ( grep sem -E ), um * no início de uma expressão ou subexpressão dentro de \(...\) (ou logo após um ^ inicial) deve ser interpretado como um literal * .

    
por 29.09.2017 / 00:32