Gostaria de saber a regra geral para usar expressão regular na cláusula if no bash?
Aqui está um exemplo
$ gg=svm-grid-ch
$ if [[ $gg == *grid* ]] ; then echo $gg; fi
svm-grid-ch
$ if [[ $gg == ^....grid* ]] ; then echo $gg; fi
$ if [[ $gg == ....grid* ]] ; then echo $gg; fi
$ if [[ $gg == s...grid* ]] ; then echo $gg; fi
$
Por que os três últimos não coincidem?
Espero que você possa fornecer tantas regras gerais quanto possível, não apenas para este exemplo.
Usar
=~
para expressões regulares, verifique o Tutorial de Expressões Regulares Índice
fonte
fonte
Adicionando esta solução com
grep
esh
builtins básicos para aqueles interessados em uma solução mais portátil (independente dabash
versão; também funciona com o antigosh
, em plataformas não Linux etc.)Algumas
grep
encarnações também suportam a-q
opção (silencioso) como alternativa ao redirecionamento para/dev/null
, mas o redirecionamento é novamente o mais portátil.fonte
grep -q
vez degrep >/dev/null
.@OP,
Não, o padrão "glob" não é usado apenas para nomes de arquivos. você também pode usá-lo para comparar strings. Em seus exemplos, você pode usar case / esac para procurar padrões de strings.
Regex são mais versáteis e "convenientes" do que "padrões glob", entretanto, a menos que você esteja fazendo tarefas complexas que "globbing / extendido" não podem fornecer facilmente, então não há necessidade de usar regex. Regex não tem suporte para a versão do bash <3.2 (como dennis mencionou), mas você ainda pode usar o globbing estendido (por configuração
extglob
). para globbing estendido, veja aqui e alguns exemplos simples aqui .Atualização para OP: exemplo para localizar arquivos que começam com 2 caracteres (os pontos "." Significa 1 caractere) seguido por "g" usando regex
por exemplo, saída
Acima, os arquivos são correspondidos porque seus nomes contêm 2 caracteres seguidos de "g". (ou seja
..g
).O equivalente com globbing será algo assim: (veja a referência para o significado de
?
e*
)fonte
ls ..g
não funciona. Você está dizendo ao shell para procurar um arquivo com nome..g
. Quanto a aprender sobre a sintaxe regex, você pode tentarperldoc perlretut
,perldoc perlrequick
ou fazer uminfo sed
na linha de comando.