Awk RegEx sta tornando nada?

Oct 30 2020

Quindi ho questo testo in un file chiamato 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';

e sto cercando di far sì che awk restituisca solo il numero di versione dalla riga:

$OC_VersionString = '20.0.1';

utilizzando (finora) questo comando:

awk -e '$1 ~ /[:digit:]+[:punct:][:digit:]+[:punct:][:digit:]+/ {print $0}' version.php

Ma quando lo uso non mi viene restituito nulla?

Questa è la prima volta che uso awk, sooo, ... BRE si sente "awk-warrrd" nerk nerk nerk

Qualcuno in grado di risolvere questo problema?

Risposte

2 RavinderSingh13 Oct 30 2020 at 14:01

Potresti provare a seguire. Scritto e testato con esempi mostrati in GNU awk.

awk '/^\$OC_VersionString/ && match($0,/\047[0-9]+\.[0-9]+\.[0-9]+\047/){
  print substr($0,RSTART+1,RLENGTH-2)
}' Input_file


Soluzione più generica: aggiunta di una soluzione più generica, testata in GNU awkche catturerà il numero di versione nel caso in cui abbia una versione minore, ad esempio -> 20.2.0.1(come esempio) anche.

awk '
/^\$OC_VersionString/ && match($0,/\047([0-9]+\.){1,}[0-9]+\047/){ print substr($0,RSTART+1,RLENGTH-2)
}' Input_file

Breve spiegazione: controllo delle condizioni/^\$OC_VersionString/per verificare se una riga inizia da/$OC_VersionString/quindi controllare che regex sia presente inmatchfunzione diawk. matchè una funzione predefinita diawkdove forniamo regex da abbinare e una volta che abbiamo trovato regex imposta i valoriRSTARTe leRLENGTHvariabili predefinite. Dove siRSTARTtrova il punto indice di partenza dell'espressione regolare abbinata ERLENGTHè la lunghezza dell'espressione regolare abbinata. Quindi stampa la sottostringa dalla riga corrente il cui punto iniziale èRSTARTfino al valore diRLENGTH.

2 WiktorStribiżew Oct 30 2020 at 14:08

Non puoi usare classi di caratteri POSIX nude, dovresti racchiuderle con espressioni di parentesi, ad esempio [:digit:]=> [[:digit:]], ecc.

Quindi, puoi vedere il valore che desideri si trova nel campo 3, mentre lo usi $1per cercare la corrispondenza. Infine, non stai estraendo il campo, stampi l'intero record con {print $0}. Inoltre, conterrà ancora 'e ';se non lo usi gsub.

Se vuoi correggere il tuo approccio, puoi usare

s="\$OC_VersionString = '20.0.1';" awk '$3 ~ /[[:digit:]]+[[:punct:]][[:digit:]]+[[:punct:]][[:digit:]]+/{gsub(/['"'"';]/,"", $3);print $3}' <<< "$s"
# => 20.0.1

Guarda la demo onlineawk .

Tuttavia, la sedsoluzione della soluzione sembra più semplice qui:

sed -n "s/.*'\\(.*\\)'.*/\\1/p" <<< "$s"
sed -n "s/.*'\\([0-9.]*\\)'.*/\\1/p" <<< "$s"
1 anubhava Oct 30 2020 at 14:07

Puoi considerare questo awk:

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