Awk RegEx sta tornando nada?
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
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.
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"
Puoi considerare questo awk:
awk -F '[[:blank:]]*=[[:blank:]]*' '$1 == "$OC_VersionString" {
gsub(/[^.0-9]+/, "", $2) print $2
}' file.php
20.0.1