awk: combina expresiones por OR lógico

awk: combina expresiones por OR lógico

Quiero combinar (O lógico) dos expresiones awk. Por separado, ambos funcionan bien. La primera expresión imprime la línea justo antes del término de búsqueda. La segunda expresión simplemente imprime la línea que contiene un carácter especial. Si combino ambas expresiones mediante un operador OR, aparece el error '

^ nueva línea inesperada o final de cadena

'

awk '(({$0~/\*/; print a; a=$0}) || (/\→/))' file.txt

archivo.txt se ve así:

foo
*
bla
bla
bar→
bar→
foo
*
bla
bla
bar→
foo
*
bla
bar→
bar→

Resultado Esperado:

foo
bar→
bar→
foo
bar→
foo
bar→
bar→

Respuesta1

Leyendo tus requerimientos, describedosdiferentes expresiones parados trabajos diferentes. Tu dices :

First expression prints the line right before the search term
Second expression just prints the line that contains a special character

Lo que significa que esas dos expresiones NO se pueden combinar en OR. Se combina con expresiones OR que realizarán la misma acción.

Como resultado, la respuesta correcta según su redacción es:

$ awk '/\*/{print a}{a=$0}/\→/' <<<"$a"
foo
bar→
bar→
foo
bar→
foo
bar→
bar→

Si realmente necesita usar una condición OR para realizar la misma acción para dos condiciones diferentes, también puede hacerlo así:

awk '/[*→]/{print a; a=$0}' file

Respuesta2

Con la nota sobre la impresión delanteriorlínea al ver un asterisco, y laactuallínea al ver un :

awk '/\*/ {print prev} /\→/ {print} {prev=$0}' file.txt

/pattern/ {action}es la abreviatura de $0 ~ /pattern/ {action}. La primera acción imprime la variable prevsi hay un asterisco en la línea, la segunda imprime la línea actual si hay una flecha y, finalmente,incondicionalmenteguarde la línea actual en prev, de modo que esté disponible para imprimir si la siguiente línea coincide.

Respuesta3

Esto debería funcionar:

awk '/\*/ || /→/ {print}' /path/to/file

Respuesta4

Esto da los resultados esperados que usted cita. No es necesario escapar del * porque podemos confiar en "En POSIX awk y gawk, '*', '+' y '?' Los operadores se defienden a sí mismos cuando no hay nada en la expresión regular que los preceda." comportamiento aquí, más detalles enhttps://www.gnu.org/software/gawk/manual/gawk.html#Regexp

$ awk '/*/||/→/' file.txt
foo*
bar→
bar→
foo**
bar→
foo*
bar→
bar→
$

Usando grep en su lugar:

$ grep -E '\*|→' file.txt

información relacionada