Awk RegEx revient nada?
J'ai donc ce texte dans un fichier nommé 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';
et j'essaye d'obtenir awk de renvoyer juste le numéro de version de la ligne:
$OC_VersionString = '20.0.1';
en utilisant (jusqu'à présent) cette commande:
awk -e '$1 ~ /[:digit:]+[:punct:][:digit:]+[:punct:][:digit:]+/ {print $0}' version.php
Mais, quand je l'utilise, rien n'est retourné?
C'est la première fois que j'utilise awk, sooo, ... BRE se sent "awk-warrrd" nerk nerk nerk
Quelqu'un est-il capable de résoudre ce problème?
Réponses
Pourriez-vous s'il vous plaît essayer de suivre. Écrit et testé avec des exemples présentés dans GNU awk.
awk '/^\$OC_VersionString/ && match($0,/\047[0-9]+\.[0-9]+\.[0-9]+\047/){
print substr($0,RSTART+1,RLENGTH-2)
}' Input_file
Solution plus générique: Ajout d'une autre solution générique, testée dans GNU, awkqui capturera le numéro de version au cas où elle aurait une version plus mineure, par exemple -> 20.2.0.1(comme exemple) aussi.
awk '
/^\$OC_VersionString/ && match($0,/\047([0-9]+\.){1,}[0-9]+\047/){ print substr($0,RSTART+1,RLENGTH-2)
}' Input_file
Brève explication: Vérification de la condition/^\$OC_VersionString/pour vérifier si une ligne commence à partir de la/$OC_VersionString/vérification de l'expression régulière présente enmatchfonction deawk. matchest une fonction par défaut de l'awkendroit où nous fournissons l'expression régulière à mettre en correspondance et une fois que nous avons correspondu à l'expression régulière, elle définit les valeursRSTARTet lesRLENGTHvariables par défaut. OùRSTARTest le point d'index de départ de l'expression régulière correspondante ETRLENGTHest la longueur de l'expression régulière correspondante. Puis impression de la sous-chaîne à partir de la ligne courante dont le point de départ estRSTARTjusqu'à la valeur deRLENGTH.
Vous ne pouvez pas utiliser de classes de caractères POSIX nues, vous devez les envelopper avec des expressions entre crochets, par exemple [:digit:]=> [[:digit:]], etc.
Ensuite, vous pouvez voir que la valeur souhaitée se trouve dans le champ 3, pendant que vous utilisez $1pour rechercher la correspondance. Et enfin, vous n'extrayez pas le champ, vous imprimez l'intégralité de l'enregistrement avec {print $0}. En outre, il contiendra toujours 'et ';si vous ne l'utilisez pas gsub.
Si vous souhaitez corriger votre approche, vous pouvez utiliser
s="\$OC_VersionString = '20.0.1';" awk '$3 ~ /[[:digit:]]+[[:punct:]][[:digit:]]+[[:punct:]][[:digit:]]+/{gsub(/['"'"';]/,"", $3);print $3}' <<< "$s"
# => 20.0.1
Voir la démo en ligneawk .
Cependant, la sedsolution de solution semble plus simple ici:
sed -n "s/.*'\\(.*\\)'.*/\\1/p" <<< "$s"
sed -n "s/.*'\\([0-9.]*\\)'.*/\\1/p" <<< "$s"
Vous pouvez envisager ceci awk:
awk -F '[[:blank:]]*=[[:blank:]]*' '$1 == "$OC_VersionString" {
gsub(/[^.0-9]+/, "", $2) print $2
}' file.php
20.0.1