Expresión regular alternativa para {}

Expresión regular alternativa para {}

Estoy intentando reemplazar toda esta línea, pero los números:

looktype="123"

entonces solo aparecen los números.

¿Es esto posible de alguna manera sencilla?

{sub ("look type=\"[0-9]{0,3}", "TEST")}

Estoy intentando esto con awk, sin éxito. Creo que "sub" y {0, 3} están interfiriendo.

Respuesta1

Enexpresiones regulares extendidas(ERE), significa repetido entre y veces. Awk implementa expresiones regulares extendidas; sin embargo, las implementaciones históricas de awk no tenían esta sintaxis de llaves para intervalos de repetición. ElX{m,n}Xmnestándar POSIXespecifica que awk debe admitir ERE, pero muchas implementaciones existentes no lo son.

Con GNU awk,intervalossólo se admiten desde la versión 4.0. Con versiones anteriores, puedes forzar que gawk sea compatible con POSIX configurando la POSIXLY_CORRECTvariable de entorno en un valor que no esté vacío:

POSIXLY_CORRECT=1 awk '{sub ("looktype=\"[0-9]{0,3}", "TEST"); print}'

La versión predeterminada de awk en algunas distribuciones no es gawk sino mawk, que es más pequeña y más rápida. Mawk no admite expresiones entre llaves.Hay un parche para eso, pero como mawk no se mantiene, no se adopta ampliamente.

Cuando el número de repeticiones es pequeño, puedes deletrearlo:

awk '{sub ("looktype=\"[0-9]?[0-9]?[0-9]?[0-9]?", "TEST"); print}'

Respuesta2

Puede canalizarlo sedpara extraer solo lo que está dentro de las comillas.

p.ej

$ echo 'looktype="123"' | sed -r -e 's/^.*"([^"]+)".*/\1/'
123

Tenga en cuenta que -res específico de GNU sed, le indica a sed que use expresiones regulares extendidas en lugar de básicas. Otras versiones de sedno lo tienen o podrían usarlo -Een su lugar. De lo contrario, escríbalo en expresión regular básica (BRE) POSIX como:

sed -e 's/^.*"\([^"][^"]*\)".*/\1/'

Respuesta3

En awk(suponiendo queexactoentrada que has publicado) también puedes hacer esto:

awk -F'=' '{print $2}' | sed 's/"//g'

Respuesta4

Una alternativa en GNU grep(que supongo que tienes debido a la etiqueta de Ubuntu):

grep -o '[0-9]\+' your_file

Una alternativa aún más portátil con Perl

perl -nle '/([0-9]+)/ and print $1' your_file

Las dos alternativas no son exactamente iguales. Se comportan de manera diferente si tiene varias instancias de una cadena de dígitos en la misma línea. La grepdeclaración imprimirá cada aparición de dígitos en una línea separada, mientras que la perldeclaración solo imprimirá la aparición más a la izquierda de una cadena de dígitos en cada línea. Esto se debe a la diferencia en la implementación interna del motor de expresiones regulares entre grepPerl y Perl.

información relacionada