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*c
deve 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 bash
você deve 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
.