
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 @reg
palavra-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
- Contexto Grep: o único contexto que o grep fornece é o número de linhas
before
eafter
uma linha correspondente [-A
,-B
,-C
(combinação das duas anteriores)] - 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.