Búsqueda de mayúsculas y minúsculas en awk

20

Necesito buscar una palabra clave usando awk, pero quiero realizar una búsqueda que no distinga entre mayúsculas y minúsculas (no distingue entre mayúsculas y minúsculas).

Creo que el mejor enfoque es capitalizar tanto el término de búsqueda ("palabra clave") como la línea objetivo que awk está leyendo al mismo tiempo. De esta pregunta, sé cómo usar toupperpara imprimir en mayúsculas, pero no sé cómo usarlo en una coincidencia porque esa respuesta solo muestra la impresión y no deja el texto en mayúscula en una variable.

Aquí hay un ejemplo, dada esta entrada:

blablabla    
&&&Key Word&&&
I want all 
these text and numbers 123
and chars !"£$%&
as output
&&&KEY WORD&&&
blablabla

Me gustaría esta salida:

I want all 
these text and numbers 123
and chars !"£$%&
as output

Esto es lo que tengo, pero no sé cómo agregar toupper:

awk "BEGIN {p=0}; /&&&key word&&&/ { p = ! p ; next } ; p { print }" text.txt
Woeitg
fuente

Respuestas:

23

Reemplace su expresión para que coincida con un patrón (es decir /&&&key word&&&/) por otra expresión explícitamente usando $0, la línea actual:

tolower($0) ~ /&&&key word&&&/

o

toupper($0) ~ /&&&KEY WORD&&&/

así que tienes

awk 'tolower($0) ~ /&&&key word&&&/ { p = ! p ; next }; p' text.txt

Es necesario comillas simples debido a la $0, el bloque BEGIN se puede quitar como variables se inicializan por defecto para ""o 0durante el primer uso, y {print}es la acción por defecto, como se menciona en los comentarios a continuación.

meuh
fuente
44
Tenga en cuenta que podría simplificar eso a awk 'toupper($0)~/&&&KEY WORD&&&/ { p = ! p ; next } ; p;' text.txt. No es necesario el BEGINbloque y, dado que la acción predeterminada es imprimir, p;es suficiente.
terdon
1
"No hay necesidad del BEGINbloque" ya que una variable no inicializada se evalúa como falsa.
Glenn Jackman
Gracias por las optimizaciones. Por lo general, trato de limitar mi respuesta a cambios mínimos en el original, pero es cierto que el nuevo resultado es mucho más estricto y bastante legible.
meuh
2
Solo una nota: tolowerestá presente en versiones antiguas (o no tan antiguas) de sistemas awk (ej .: AIX), pero toupperno siempre está disponible ^^.
Olivier Dulac
16

gawk tiene una IGNORECASEvariable incorporada que, si se establece en cero, hace que todas las comparaciones de cadenas y expresiones regulares no distingan entre mayúsculas y minúsculas. Podrías usar eso:

BEGIN{IGNORECASE=1}
/&&&key word&&&/ { foo bar baz }

Sin gawkembargo, esto es específico de , pero me parece más legible que la alternativa (más portátil) de meuh. Si eso es un problema, por supuesto, depende totalmente de usted.

Wouter Verhelst
fuente
1
He querido apoyar a awk durante años en uno de mis proyectos más grandes de gawk, pero la falta de búsqueda sin distinción entre mayúsculas y minúsculas provoca que gawk lo haya convertido en un no iniciador debido a la cantidad de búsquedas insensibles a mayúsculas y minúsculas que ejecuta el material. gensub es la otra característica única de gawk que fue demasiado difícil de reemplazar en awk. Pero gawk no siempre se instala de manera predeterminada en algunas máquinas y distribuciones, aunque casi siempre está disponible, pero es lamentable que para 2016 no pudieran cambiar awk y posix para ampliar un poco la funcionalidad de tales herramientas estándar.
Lizardx
3
@Lizardx: ese es el punto de no expandirse: manténgalo estándar. De lo contrario, solo crea otro estándar, y luego tiene algunas incompatibilidades entre ellos (lo hacen, pero intentan mantener los cambios al mínimo ... incluso entonces, el estándar múltiple es una de las principales plagas de la informática)
Olivier Dulac
2
No estoy de acuerdo Con una ejecución cuidadosa, puede introducir expansiones mientras admite todos los métodos heredados, lo que sucede si no lo hace es que las cosas comienzan a desvanecerse en la irrelevancia con el tiempo. Todo en informática evoluciona, el truco es mantener una evolución confiable muy estable. Bash es un buen ejemplo de eso, es súper confiable y simplemente agrega nuevas funciones, no son 'dos ​​estándares' tanto como, usa lo que es compatible, y una vez que los cambios se han implementado globalmente, puedes comenzar a usar las nuevas funciones porque solo Los sistemas heredados más antiguos no tendrán soporte.
Lizardx