grep texto opcional de tamanho variável

4

Eu gostaria de pesquisar por texto de borda ancorada que tenha um bloco de texto opcional anterior, e qualquer valor pode ser incluído na correspondência. Por exemplo, supondo que eu estou tentando encontrar ^xyz , mas também aceitar ^wxyz , ^vwxyz , ^uvwxyz , ^tuvwxyz , ^stuvwxyz , ^rstuvwxyz , mas há outras possibilidades (para minha pesquisa real, eu não poderia simplesmente usar uma seqüência de caracteres regex como [r-w] porque o bloco real da anterior personagens não estão em ordem alfabética como neste exemplo simplificado), eu poderia usar o comando egrep '^r?s?t?u?v?w?xyz' . Existe outra maneira de escrever esta pesquisa, de modo que eu poderia simplesmente aplicar o sinalizador opcional ( ? ) a toda a sequência, em vez de aplicar a cada elemento individualmente?

Editar:

Aqui está um exemplo de dados mais realistas: O texto completo a ser correspondido é AZHDEOIMOSJDJKEJLCN. No entanto, as letras são perdidas de forma variável a partir da extremidade esquerda, portanto, todos os itens a seguir devem ser correspondidos:

^AZHDEOIMOSJDJKEJLCN
^ZHDEOIMOSJDJKEJLCN
^HDEOIMOSJDJKEJLCN
^DEOIMOSJDJKEJLCN
^EOIMOSJDJKEJLCN
^OIMOSJDJKEJLCN
^IMOSJDJKEJLCN
^MOSJDJKEJLCN
^OSJDJKEJLCN
^SJDJKEJLCN
^JDJKEJLCN
^DJKEJLCN
^JKEJLCN
^KEJLCN

Assim, o KEJLCN residual é essencial e tudo o que o precede é opcional. No entanto, não posso simplesmente grep para KEJLCN porque desejo apenas instâncias ancoradas no início da linha ( ^ ) e são opcionalmente precedidas pelos outros caracteres listados acima. Além disso, observe que a cadeia de pesquisa estará em uma variável e o resíduo mínimo (por exemplo, KEJLCN ) será extraído por uma operação de substring em um script (por exemplo, em um ambiente perl, executando egrep como um comando do sistema procurando pelo texto $query , o texto essencial estaria contido em substr($query,-6) e o texto opcional opcional estaria contido em substr($query,0,length($query)-6 ). Portanto, a solução deve ser válida para regex em forma de variável e não apenas para literais de string.

    
por user001 31.07.2014 / 00:28

1 resposta

2
grep '[[:lower:]]*xyz'

Você retornaria todas as linhas nas quais esse padrão é correspondido. Mas, claro, isso não corresponde a sequências explícitas de caracteres.

Ainda assim, isso parece ser um problema que você já resolveu:

grep -f - <<\STRINGS /dev/fd/3 3<<\DATA
^ZHDEOIMOSJDJKEJLCN
^HDEOIMOSJDJKEJLCN
^DEOIMOSJDJKEJLCN
^EOIMOSJDJKEJLCN
^OIMOSJDJKEJLCN
^IMOSJDJKEJLCN
^MOSJDJKEJLCN
^OSJDJKEJLCN
^SJDJKEJLCN
^JDJKEJLCN
^DJKEJLCN
^JKEJLCN
^KEJLCN
STRINGS

SJDJKEJLCN                                                                  
JDJKEJLCN
o;aidsfjoasjif
KKEJnotLCN
DATA

OUTPUT

SJDJKEJLCN                                                                 
JDJKEJLCN 

Se você quiser gerar programaticamente a mesma tabela de consulta ...

grep -f - <<STRINGS /dev/fd/3 3<<\DATA
$(
    MATCH=ZHDEOIMOSJDJKEJLCN
    until [ ${#MATCH} -lt ${MINLEN=6} ]
    do  printf '^%s\n' "$MATCH"
        MATCH=${MATCH#?}
    done
)
STRINGS

SJDJKEJLCN                                                                  
JDJKEJLCN                                                                  
o;aidsfjoasjif                                                             
KKEJnotLCN                                                                 
DATA

OUTPUT

SJDJKEJLCN                                                                  
JDJKEJLCN
    
por 31.07.2014 / 01:36

Tags