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_data
yawk '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_data
es compatible con casi todas lasawk
versiones.awk --re-interval '/^.{4}$/' test_data
oawk --posix '/^.{4}$/' test_data
trabajar?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
gawk
4.0Como está utilizando
gawk
3.x, deberá usaro
o (gracias @ StéphaneChazelas) si desea una solución que sea portátil, use
(ya que
--posix
o--re-interval
causaría un error en otrasawk
implementaciones).fuente
POSIXLY_CORRECT=anything awk '/^.{4}/'
ya que hace que el código portátil (--posix
ao--re-interval
podría causar un error en otrasawk
implementaciones).ERE ( expresiones regulares extendidas como las utilizadas por
awk
oegrep
) inicialmente no tenían{x,y}
. Se introdujo por primera vez en BRE (como lo usagrep
osed
), 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/nawk
y/bin/egrep
en Solaris todavía no lo respeta (debe usar/usr/xpg4/bin/awk
o/usr/xpg4/bin/grep -E
). Lo mismo paraawk
ynawk
en FreeBSD (basado en elawk
mantenido por Brian Kernighan (elk
enawk
)).Para GNU
awk
, hasta hace relativamente poco (versión 4.0), tenía que llamarloPOSIXLY_CORRECT=anything awk '/^.{4}$/'
para que lo honrara.mawk
Todaví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
mawk
que está más cerca de POSIXawk
y, AFAIK, es el predeterminado en los sistemas Ubuntu:Entonces, una solución simple sería usar en
gawk
lugar deawk
. La{n}
notación no es parte de la sintaxis POSIX BRE (expresión regular básica). Es por esogrep
tambié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ónmawk
POSIXawk
, pero supongo que es BREawk
que 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.mawk
no está realmente más cerca de POSIXawk
, y no usa BRE. Utiliza ERE pero sin el{x,y}
operador.