A veces, quiero comprobar si mi expresión regular es correcta.
¿Cómo puedo hacer regex
una coincidencia inversa desde la entrada estándar?
Fe, puedo hacer coincidir una cadena con la expresión regular proporcionada, como:
grep "\(foo\)-bar"
foo
bar
foo-bar
foo-bar #Match found
Lo que me gustaría hacer es lo contrario, algo como esto:
$ grep "This is one string"
\(This\) #Will send "This" to stdout
This?.* #Will send full match
¿Es esto posible de alguna manera sin muchas secuencias de comandos?
Respuesta1
Defina la siguiente función en su shell (puede simplemente escribirla o ponerla en su ~/.bashrc
):
testregex() {
[ "$#" -eq 1 ] || return 1
while IFS= read -r line; do
printf '%s\n' "$1" | grep -Eoe "$line"
done
}
Luego puedes probar una expresión regular de la siguiente manera:
$ testregex 'This is a line'
This <--input
This <--output
This?.* <--input
This is a line <--output
slkdjflksdj <--input with no output (no match)
s.* <--input
s is a line <--output
$ <--I pressed Ctrl-D to end the test
Respuesta2
Puede utilizarlo -
como "archivo" para buscar, que utilizará la entrada estándar como "pajar" para buscar "agujas" coincidentes en:
$ grep -oE '[aeiou]+' -
This is a test < input
i > output
i > output
a > output
e > output
whaaaat? < input
aaaa > output
Utilice Ctrl- Dpara enviar EOF
y finalizar la transmisión.
Sin embargo, no creo que puedas hacer lo mismo para usar la entrada estándar para el -f
conmutador que lee una lista de patrones de un archivo. Sin embargo, si tiene muchos patrones para enviar mensajes de texto en un corpus, puede:
grep -f needle-patterns haystack.txt
donde needle-patterns
hay un archivo de texto sin formato con una expresión regular por línea.