
Supongamos que hay un texto (código ensamblador)
st.w av,d15
ld.w d15,av
Supongamos que queremos combinarlo con grep. Podemos usar este patrón:
pattern=\
'\s+st.w\s+av,.*'\
'\s+ld.w\s+.*,av'
Nota: utilizamos .*
para hacer coincidir los nombres de los registros. En el futuro estos nombres de registros pueden cambiar.
Supongamos que queremos usar expresiones regulares especiales para los nombres de los registros. Agregamos @reg
una palabra clave especial:
pattern=\
'\s+st.w\s+av,@reg'\
'\s+ld.w\s+@reg,av'
Luego agregamos una función atractiva para el patrón grep, donde reemplazamos todas las palabras clave especiales por patrones de expresiones regulares reales:
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"
}
Luego llamamos preprocess_pattern()
antes de ejecutar grep
:
pattern="$(preprocess_pattern $pattern)"
if ! grep -Pzo $pattern code.asm > /dev/null
then
echo "grep #$i failed (pattern: "$pattern")"
((++failed))
fi
Funciona, pero queremos más.
queremos agregar@preg
, que esregistro anterior.
pattern=\
'\s+st.w\s+av,@reg'\
'\s+ld.w\s+@preg,av'
Ahora la pregunta: ¿dónde está (y cómo) agregar la lógica, que después de cada aparición de@reg
ahorrael valor coincidente (en nuestro caso d15
) en la pila/búfer especial y después de cada aparición del@preg
recuperael valor coincidente de la pila/búfer y compara este valor con el valor de @preg
?
En otras palabras: cómo escribir un patrón para hacer coincidir datos consensible al contexto¿elementos? ¿Es posible con grep?
En caso afirmativo (es decir, posible), ¿cómo describir esto?sensibilidad al contextoen el patrón?
Si no (es decir, imposible), ¿de qué otra manera resolver este desafío?
Respuesta1
Lo que está tratando de lograr podría lograrse con grep + regex, pero eso será complicado. Su tarea necesita un script completo o un programa en algún idioma.
Las siguientes características de diferentes comandos pueden resultar útiles
- Contexto Grep: el único contexto que proporciona grep es el número de líneas
before
yafter
una línea coincidente [-A
,, (combinación de las dos anteriores)-B
]-C
- Awk y Sed: con estos puedes buscar texto dentro de 2 patrones.
Pero nuevamente, esto va a ser complicado. Por lo que tengo entendido, estás intentando escribir algún tipo de analizador, por lo que debes investigar e intentar utilizar la herramienta de escritura antes de lanzarte a escribir comandos complicados.