Como encontro essa string?

2

Estou tentando combinar esses nomes de arquivos com o comando find:

4702011-10-21CR719557-R85262-ALPHA.jar
4702011-10-21CR719557-R85262-BETA.jar

Estou razoavelmente familiarizado com a sintaxe regex Java-Perl. Infelizmente, encontrar apenas suporta emacs e sintaxe posix.

Mesmo depois de observar a sintaxe do emacs, não consigo fazer uma correspondência básica funcionar.

find . -regex "^[[:digit:]]+" -- matches nothing
find . -regex "^[[:digit:]]+.*(ALPHA\|BETA)\.jar" -- matches nothing

Isso é bastante simples em Java e Perl, por exemplo:

ls | grep -P "^\d+.*(ALPHA|BETA)\.jar"

funciona.

    
por KaizenSoze 09.11.2011 / 17:26

3 respostas

2

um regex para correspondência desses arquivos com o regxtype posix-awk ou posix-extended seria:

find . -regextype posix-awk -regex ".*/[[:digit:]]+-[[:digit:]]+-[A-Z0-9]+-[A-Z0-9]+-(ALPHA|BETA)\.jar"

porque find -regex faz correspondências, não pesquisas

você pode especificar o tipo de regex com -regextype. veja a manpage de sua implementação de localização para verificar quais mecanismos de regex são suportados.

exemplo (obtenha os arquivos, independentemente da profundidade da pasta):

root@smgw:/tmp# ls -1
4702011-10-21CR719557-R85262-ALPHA.jar
4702011-10-21CR719557-R85262-BETA.jar
one
root@smgw:/tmp# find . -regextype posix-awk -regex ".*/[[:digit:]]+-[[:digit:]]+-[A-Z0-9]+-[A-Z0-9]+-(ALPHA|BETA)\.jar"
./4702011-10-21CR719557-R85262-ALPHA.jar
./4702011-10-21CR719557-R85262-BETA.jar

mova os frascos, certifique-se de que eles ainda sejam devolvidos

pesquise-os com um caminho de abs

root@smgw:/tmp# find /tmp  -regextype posix-awk -regex ".*/[[:digit:]]+-[[:digit:]]+-[A-Z0-9]+-[A-Z0-9]+-(ALPHA|BETA)\.jar"
/tmp/4702011-10-21CR719557-R85262-ALPHA.jar
/tmp/4702011-10-21CR719557-R85262-BETA.jar

profundidade modificada:

root@smgw:/tmp# mkdir -p x/y/z
root@smgw:/tmp# cp *^C
root@smgw:/tmp# mv *.jar x/y/z/
root@smgw:/tmp# find /tmp  -regextype posix-awk -regex ".*/[[:digit:]]+-[[:digit:]]+-[A-Z0-9]+-[A-Z0-9]+-(ALPHA|BETA)\.jar"
/tmp/x/y/z/4702011-10-21CR719557-R85262-ALPHA.jar
/tmp/x/y/z/4702011-10-21CR719557-R85262-BETA.jar
    
por 09.11.2011 / 17:48
3

Um regex usando o estilo emacs para corresponder ao seu padrão pode ser:

".*/[0-9]+-[0-9]+-[0-9A-Z]+-[0-9A-Z]+-\(ALPHA\|BETA\)\.jar$"

Abaixo está um teste simples que fiz:

abarbosa@SPF-157:~/Temp/test$ ls -1
4702011-10-21CR719557-R85262-ALPHA.jar
4702011-10-21CR719557-R85262-BETA.jar
whatever.jar
abarbosa@SPF-157:~/Temp/test$ find . -regex ".*/[0-9]+-[0-9]+-[0-9A-Z]+-[0-9A-Z]+-\(ALPHA\|BETA\)\.jar$"
./4702011-10-21CR719557-R85262-BETA.jar
./4702011-10-21CR719557-R85262-ALPHA.jar
    
por 09.11.2011 / 17:52
1

De acordo com o man find , isso corresponde a todo o caminho , não uma pesquisa. Então, você deve usar algo assim:

$ find . -regex .*/[0-9]+.*\.jar

Você também pode alterar o tipo de expressão regular para posix-awk, posix-basic, posix-extended, ... com a opção -regextype .

    
por 09.11.2011 / 17:40

Tags