¿Awk RegEx no devuelve nada?
Entonces tengo este texto en un archivo llamado version.php :
<?php
$OC_Version = array(20,0,1,1); $OC_VersionString = '20.0.1';
$OC_Edition = ''; $OC_Channel = 'stable';
$OC_VersionCanBeUpgradedFrom = array ( 'nextcloud' => array ( '19.0' => true, '20.0' => true, ), 'owncloud' => array ( ), ); $OC_Build = '2020-10-24T08:39:55+00:00 89d88b3ea5b4049355e3c49d121f82e5e62bfc44';
$vendor = 'nextcloud';
y estoy tratando de que awk devuelva solo el número de versión de la línea:
$OC_VersionString = '20.0.1';
usando (hasta ahora) este comando:
awk -e '$1 ~ /[:digit:]+[:punct:][:digit:]+[:punct:][:digit:]+/ {print $0}' version.php
Pero, cuando lo uso, ¿no se devuelve nada?
Esta es la primera vez que uso awk, muuuuuuuuuuuuuuuuuuuuuu ... BRE se siente "awk-warrrd" nerk nerk nerk
¿Alguien puede solucionar esto?
Respuestas
¿Podría intentar seguirlo? Escrito y probado con muestras mostradas en GNU awk.
awk '/^\$OC_VersionString/ && match($0,/\047[0-9]+\.[0-9]+\.[0-9]+\047/){
print substr($0,RSTART+1,RLENGTH-2)
}' Input_file
Solución más genérica: Agregar una solución genérica más, probada en GNU awkque capturará el número de versión en caso de que tenga una versión menor, por ejemplo -> 20.2.0.1(como ejemplo) también.
awk '
/^\$OC_VersionString/ && match($0,/\047([0-9]+\.){1,}[0-9]+\047/){ print substr($0,RSTART+1,RLENGTH-2)
}' Input_file
Breve explicación: Verificando condición/^\$OC_VersionString/para verificar si una línea comienza desde y/$OC_VersionString/luego verificando que la expresión regular presente enmatchfunción deawk. matches una función predeterminada deawkdonde proporcionamos regex para que coincida y una vez que hemos emparejado regex establece valores deRSTARTyRLENGTHvariables predeterminadas. DondeRSTARTes el punto de índice inicial de la expresión regular coincidente YRLENGTHes la longitud de la expresión regular coincidente. Luego imprime la subcadena desde la línea actual cuyo punto de inicio esRSTARThasta el valor deRLENGTH.
No puede usar clases de caracteres POSIX desnudas, debe envolverlas con expresiones de corchetes, por ejemplo, [:digit:]=> [[:digit:]], etc.
Luego, puede ver que el valor que desea se encuentra en el campo 3, mientras lo usa $1para buscar la coincidencia. Y, por último, no está extrayendo el campo, imprime el registro completo con {print $0}. Además, todavía contendrá 'y ';si no lo usa gsub.
Si desea corregir su enfoque, puede utilizar
s="\$OC_VersionString = '20.0.1';" awk '$3 ~ /[[:digit:]]+[[:punct:]][[:digit:]]+[[:punct:]][[:digit:]]+/{gsub(/['"'"';]/,"", $3);print $3}' <<< "$s"
# => 20.0.1
Vea la demostración en líneaawk .
Sin embargo, la sedsolución de solución parece más simple aquí:
sed -n "s/.*'\\(.*\\)'.*/\\1/p" <<< "$s"
sed -n "s/.*'\\([0-9.]*\\)'.*/\\1/p" <<< "$s"
Puede considerar esto awk:
awk -F '[[:blank:]]*=[[:blank:]]*' '$1 == "$OC_VersionString" {
gsub(/[^.0-9]+/, "", $2) print $2
}' file.php
20.0.1