grep + regex: como escrever um padrão para combinar dados com elementos sensíveis ao contexto?

grep + regex: como escrever um padrão para combinar dados com elementos sensíveis ao contexto?

Suponha que haja um texto (código assembly)

st.w    av,d15
ld.w    d15,av

Suponha que queiramos combiná-lo com grep. Podemos usar este padrão:

pattern=\
'\s+st.w\s+av,.*'\
'\s+ld.w\s+.*,av'

Nota: usamos .*para combinar os nomes dos registros. No futuro, esses nomes de registro poderão mudar.

Suponha que queiramos usar regex especial para nomes de registradores. Adicionamos @regpalavra-chave especial:

pattern=\
'\s+st.w\s+av,@reg'\
'\s+ld.w\s+@reg,av'

Em seguida, adicionamos uma função atraente para o padrão grep, onde substituímos todas as palavras-chave especiais por padrões regex reais:

preprocess_pattern () {
    local result=$1
    # Replace @reg to exact regex pattern [a..d][0..15].
    result=${result//'@reg'/'[a-d](1[0-5]|[0-9])'}
    # Add other replacements (if need).
    #result=${result//''/''}
    echo "$result"
}

Então chamamos preprocess_pattern()antes de executar grep:

pattern="$(preprocess_pattern $pattern)"
if ! grep -Pzo $pattern code.asm > /dev/null
then
    echo "grep #$i failed (pattern: "$pattern")"
    ((++failed))
fi

Funciona, mas queremos mais.

Queremos adicionar @preg, que éregistro anterior.

pattern=\
'\s+st.w\s+av,@reg'\
'\s+ld.w\s+@preg,av'

Agora a questão: onde está (e como) adicionar a lógica, que após cada ocorrência de@reg economizaro valor correspondente (no nosso caso d15) na pilha/buffer especial e após cada ocorrência do@preg recuperao valor correspondente da pilha/buffer e compara esse valor com o valor do @preg?

Em outras palavras: como escrever um padrão para combinar dados comsensível ao contextoelementos? É possível com o grep?

Se sim (ou seja, possível), então como descrever issosensibilidade ao contextono padrão?

Se não (ou seja, impossível), então de que outra forma resolver este desafio?

Responder1

O que você está tentando alcançar pode ser alcançado por grep + regex, mas isso será complicado. Sua tarefa precisa de um script completo ou de um programa em algum idioma.

Seguir os recursos de diferentes comandos pode ser útil

  1. Contexto Grep: o único contexto que o grep fornece é o número de linhas beforee afteruma linha correspondente [ -A, -B, -C(combinação das duas anteriores)]
  2. Awk e Sed: usando estes você pode pesquisar texto em 2 padrões.

Mas, novamente, isso vai ser complicado. Pelo que entendi, você está tentando escrever algum tipo de analisador, então você deve pesquisar e tentar usar a ferramenta de gravação antes de começar a escrever comandos complicados.

informação relacionada