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 prev
si 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