Regex e padrões em uma linha de comando ksh

0

Eu estou querendo saber qual é a diferença entre usar * e .* em uma string regex.

Acho que * significa "0 para n caracteres", mas não vejo o que significa .* .

Por exemplo, qual é a diferença entre: "2013*11*27" e "2013.*11.*27" ? Se eu der uma olhada para

find . -name [pattern]

Como padrão, tentei: "2013.*11.*25" e não encontrei "2013-11-25" , no entanto, com "2013*11*25" , foi encontrado.

Por quê? No unix, 0 ou n ocorrências de curingas são: * , em regex .* , por que não funciona?

    
por user1058398 27.11.2013 / 10:58

2 respostas

3

* representa 0 ou mais caracteres arbitrários em correspondências curingas de shell .

* significa 0 ou mais ocorrências de a expressão anterior em correspondências regex .

. significa caractere arbitrário único em correspondências regex .

Assim, * na correspondência de curinga de shell é equivalente a .* na correspondência de expressão regular.

"2013 * 11 * 27" na correspondência de regex corresponderá a "2013333111111111127" , mas não a "2013-11-27" , mas se você usá-la para encontrar arquivos, por exemplo, como argumento para ls , deixando o shell manipulá-lo como "correspondência de caractere curinga de shell" (e não regex), ele irá capturar "2013-11-27" bem.

* (no seu caso, a expressão é um único caractere que corresponde exatamente a esse caractere, 3 e 1 respectivamente.)

    
por 27.11.2013 / 11:09
2

Primeiro, você precisa separar o regexp do padrão de shell unix.
No comando ksh esperar opção especial, você usará o padrão unix.
se você usar, por exemplo, grep -R, você usará o regexp.

O * na sintaxe de regex significa 0 ou n ocorrências.
O * no padrão unix significa qualquer string e dependendo das configurações com ou sem salto de linha.
Se você usar regexp .* significa qualquer caractere exceto linha de salto 0 ou n time
e usar * em um regex corresponderá ao caractere anterior 0 ou n tempo.

.* na regexp é equivalente a unix pattenr *

find -name usa o padrão unix, portanto, usar .* em um padrão significa encontrar .ANY_STRING_OR_NO_STRING no sring.
você usa o uso de regexp em find -regex

Respeito

    
por 27.11.2013 / 11:09