Awk RegEx revient nada?

Oct 30 2020

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

2 RavinderSingh13 Oct 30 2020 at 14:01

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.

2 WiktorStribiżew Oct 30 2020 at 14:08

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"
1 anubhava Oct 30 2020 at 14:07

Vous pouvez envisager ceci awk:

awk -F '[[:blank:]]*=[[:blank:]]*' '$1 == "$OC_VersionString" {
   gsub(/[^.0-9]+/, "", $2) print $2
}' file.php
20.0.1