Probando expresiones regulares desde stdin usando grep|sed|awk

Probando expresiones regulares desde stdin usando grep|sed|awk

A veces, quiero comprobar si mi expresión regular es correcta.

¿Cómo puedo hacer regexuna 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 EOFy finalizar la transmisión.

Sin embargo, no creo que puedas hacer lo mismo para usar la entrada estándar para el -fconmutador 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-patternshay un archivo de texto sin formato con una expresión regular por línea.

información relacionada