Estoy tratando de imprimir las líneas usando el símbolo de repetición {n} pero no funciona. Por. Por ejemplo, quiero imprimir todas las líneas cuya longitud es de 4 caracteres.
awk '/^.{4}$/' test_data
El código anterior no está imprimiendo eso. ¿Cómo solucionarlo para que pueda usar el símbolo de repetición? Sé la alternativa como awk '/^....$/' test_datayawk 'length ==3 ' test_data
awk
regular-expression
Forever Learner
fuente
fuente

awk '/^.{4}+$/{print}' <<<$'foods\nbaarsz\nfooo'que coincida exactamente con 4 caracteres. Además, como mencionaste,awk 'length($0) == 4' test_dataes compatible con casi todas lasawkversiones.awk --re-interval '/^.{4}$/' test_dataoawk --posix '/^.{4}$/' test_datatrabajar?Respuestas:
De acuerdo con la Guía del usuario de GNU Awk: Historial de características , se agregó soporte para operadores de rango de expresión regular en la versión 3.0, pero inicialmente requería la opción de línea de comando explícita
Nuevas opciones de línea de comandos:
En
gawk4.0Como está utilizando
gawk3.x, deberá usaro
o (gracias @ StéphaneChazelas) si desea una solución que sea portátil, use
(ya que
--posixo--re-intervalcausaría un error en otrasawkimplementaciones).fuente
POSIXLY_CORRECT=anything awk '/^.{4}/'ya que hace que el código portátil (--posixao--re-intervalpodría causar un error en otrasawkimplementaciones).ERE ( expresiones regulares extendidas como las utilizadas por
awkoegrep) inicialmente no tenían{x,y}. Se introdujo por primera vez en BRE (como lo usagreposed), pero con la\{x,y\}sintaxis que no rompió la portabilidad hacia atrás.Pero cuando se agregó a ERE con esa
{x,y}sintaxis, rompió la portabilidad hacia atrás ya que unfoo{2}RE coincidía con algo diferente antes.Entonces, algunas implementaciones decidieron no hacerlo. Usted encontrará que
/bin/awk,/bin/nawky/bin/egrepen Solaris todavía no lo respeta (debe usar/usr/xpg4/bin/awko/usr/xpg4/bin/grep -E). Lo mismo paraawkynawken FreeBSD (basado en elawkmantenido por Brian Kernighan (elkenawk)).Para GNU
awk, hasta hace relativamente poco (versión 4.0), tenía que llamarloPOSIXLY_CORRECT=anything awk '/^.{4}$/'para que lo honrara.mawkTodavía no lo honra .Tenga en cuenta que ese operador es solo azúcar sintáctico.
.{3,5}siempre se puede escribir,....?.?por ejemplo (aunque, por supuesto,{3,5}es mucho más legible, y el equivalente a(foo.{5,9}bar){123,456}sería mucho peor).fuente
Esto funciona como se esperaba con GNU
awk(gawk):Pero falla con
mawkque está más cerca de POSIXawky, AFAIK, es el predeterminado en los sistemas Ubuntu:Entonces, una solución simple sería usar en
gawklugar deawk. La{n}notación no es parte de la sintaxis POSIX BRE (expresión regular básica). Es por esogreptambién falla aquí:Sin embargo, es parte de ERE (expresiones regulares extendidas):
No sé qué sabor regex utiliza. Usan una versión anterior de ERE según la respuesta de Stéphane . En cualquier caso, aparentemente está utilizando una versiónmawkPOSIXawk, pero supongo que es BREawkque no implementa ERE o su entrada no tiene líneas con exactamente 4 caracteres. Esto podría suceder debido a espacios en blanco que no ve o glifos unicode, por ejemplo.fuente
length($0)que sea más eficiente que las expresiones regulares.mawkno está realmente más cerca de POSIXawk, y no usa BRE. Utiliza ERE pero sin el{x,y}operador.