
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}
X
m
n
está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_CORRECT
variable 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 sed
para extraer solo lo que está dentro de las comillas.
p.ej
$ echo 'looktype="123"' | sed -r -e 's/^.*"([^"]+)".*/\1/'
123
Tenga en cuenta que -r
es específico de GNU sed, le indica a sed que use expresiones regulares extendidas en lugar de básicas. Otras versiones de sed
no lo tienen o podrían usarlo -E
en 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 grep
declaración imprimirá cada aparición de dígitos en una línea separada, mientras que la perl
declaració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 grep
Perl y Perl.