Expressões regulares em um shell

Expressões regulares em um shell

Tenho duas dúvidas sobre o uso de expressões regulares dentro de um shell.

1. Uso de *

De acordo compágina da Wikipedia sobre expressões regulares:

*: O asterisco indica que há zero ou mais do elemento anterior. Por exemplo, ab*c corresponde a "ac", "abc", "abbc", "abbbc" e assim por diante.

No entanto, quando eu escrevo rm test*.iso, ele excluirá todos os arquivos começando com "teste" e terminando com ".iso", o que quer que haja (ou não) entre "teste" e ".iso". Então, o arquivo "tes.iso" seránãoexcluído.

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

2. Uso de - e ?

Ainda de acordo compágina da Wikipedia sobre expressões regulares:

?: O ponto de interrogação indica que há zero ou um dos elementos anteriores. Por exemplo, color corresponde a "cor" e "cor".

+: O sinal de mais indica que há um ou mais elementos anteriores. Por exemplo, ab+c corresponde a "abc", "abbc", "abbbc" e assim por diante, mas não a "ac".

"?" parece funcionar como "*", ou seja, "?" o símbolo substitui um ou zero elemento (mas não o anterior, ao contrário do que diz a Wikipedia).

Não sei usar "+" e esta é minha segunda pergunta. Também estou interessado em truques relacionados a expressões regulares e arquivos rm, cp, ....

Responder1

A conchanotação de correspondência de padrõesé descrito emeste documento de padrões.

Como diz o documento em sua introdução, a notação de correspondência de padrões está relacionada, mas é um pouco diferente, da 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 @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.

Responder2

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

Em bashvocê deve ativá-los com:shopt -s extglob

Depois disso você pode usar algo como:

echo a*(b)c

Veja o bloco Pattern Matchingem man bash.

informação relacionada