Expressões regulares em um shell [duplicado]

0

Eu tenho duas perguntas sobre o uso de expressões regulares dentro de um shell.

1. Uso de *

De acordo com página da Wikipédia sobre expressões regulares :

*: The asterisk indicates there is zero or more of the preceding element. For example, ab*c matches "ac", "abc", "abbc", "abbbc", and so on.

No entanto, quando eu escrevo rm test*.iso , ele irá deletar todos os arquivos começando por "teste" e terminando com ".iso" o que houver (ou não) entre "teste" e ".iso". Portanto, o arquivo "tes.iso" não será excluído.

Se você pegar o exemplo abc, de acordo com a Wikipédia, "ab * c" corresponde a "ac". Portanto, rm ab*c deve excluir um arquivo "ac". Por que o rm não usa expressões regulares como a wikipedia as descreve?

2. Uso de - e?

Ainda de acordo com página da Wikipédia sobre expressões regulares :

?: The question mark indicates there is zero or one of the preceding element. For example, colou?r matches both "color" and "colour".

+: The plus sign indicates there is one or more of the preceding element. For example, ab+c matches "abc", "abbc", "abbbc", and so on, but not "ac".

"?" parece funcionar como "*", isto é, "?" O símbolo substitui um ou zero elemento (mas não o precedente contrário, como diz o wikipedia).

Eu não sei como usar "+" e esta é minha segunda pergunta. Também estou interessado em qualquer truque relacionado a expressões regulares e rm, cp, ... .

    
por ppr 11.05.2014 / 16:26

2 respostas

2

A notação de correspondência de padrões do shell é descrita em documento de normas .

Como o documento diz em sua introdução, a notação de correspondência de padrões está relacionada, mas ligeiramente diferente, à notação de expressão regular.

Em particular, ? no shell age como . em uma expressão regular e * no shell age como .* em uma expressão regular. (Mas nenhum deles corresponderá a . no início de um nome de arquivo.) + no shell não possui nenhuma capacidade especial de correspondência de padrões. No entanto, como a @HaukeLaging diz em sua resposta, certos shells podem opcionalmente ter a notação de expressão regular habilitada, embora isso não seja padrão.

    
por 11.05.2014 / 16:50
0

O shell usa expressões regulares apenas sob determinadas condições (que provavelmente diferem de shell para shell).

Em bash , você precisa ativá-los com: shopt -s extglob

Depois disso, você pode usar algo como:

echo a*(b)c

Veja o bloco Pattern Matching em man bash .

    
por 11.05.2014 / 16:42