Awk RegEx devolvendo nada?
Então, eu tenho este texto em um arquivo chamado 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 estou tentando fazer o awk retornar apenas o número da versão da linha:
$OC_VersionString = '20.0.1';
usando (até agora) este comando:
awk -e '$1 ~ /[:digit:]+[:punct:][:digit:]+[:punct:][:digit:]+/ {print $0}' version.php
Mas, quando eu uso, nada é devolvido?
Esta é minha primeira vez usando awk, entao, ... BRE sente-se "awk-mandado" nerk nerk nerk
Alguém capaz de resolver isso?
Respostas
Você poderia tentar seguir. Escrito e testado com exemplos mostrados no GNU awk.
awk '/^\$OC_VersionString/ && match($0,/\047[0-9]+\.[0-9]+\.[0-9]+\047/){
print substr($0,RSTART+1,RLENGTH-2)
}' Input_file
Solução mais genérica: Adicionar mais uma solução genérica, testada em GNU, awkque irá capturar o número da versão caso tenha mais versões secundárias, por exemplo -> 20.2.0.1(como exemplo) também.
awk '
/^\$OC_VersionString/ && match($0,/\047([0-9]+\.){1,}[0-9]+\047/){ print substr($0,RSTART+1,RLENGTH-2)
}' Input_file
Breve explicação: Verificando condição/^\$OC_VersionString/para verificar se uma linha começa a partir/$OC_VersionString/daí verificando aquela regex presente emmatchfunção deawk. matché uma função padrão deawkonde fornecemos o regex a ser correspondido e, uma vez que tenhamos correspondido o regex, ele define os valoresRSTARTeRLENGTHas variáveis padrão. OndeRSTARTé o ponto inicial do índice da regex correspondida ERLENGTHé o comprimento da regex correspondida. Em seguida, imprimindo a sequência secundária da linha atual cujo ponto inicial éRSTARTaté o valor deRLENGTH.
Você não pode usar classes de caracteres POSIX nuas, você deve envolvê-los com expressões de colchetes, por exemplo, [:digit:]=> [[:digit:]], etc.
Então, você pode ver que o valor que deseja está localizado no Campo 3, enquanto você usa $1para pesquisar a correspondência. E por último, você não está extraindo o campo, você imprime o registro inteiro com {print $0}. Além disso, ele ainda conterá 'e ';se você não usar gsub.
Se você quiser corrigir sua abordagem, pode usar
s="\$OC_VersionString = '20.0.1';" awk '$3 ~ /[[:digit:]]+[[:punct:]][[:digit:]]+[[:punct:]][[:digit:]]+/{gsub(/['"'"';]/,"", $3);print $3}' <<< "$s"
# => 20.0.1
Veja a demonstração onlineawk .
No entanto, a sedsolução da solução parece mais simples aqui:
sed -n "s/.*'\\(.*\\)'.*/\\1/p" <<< "$s"
sed -n "s/.*'\\([0-9.]*\\)'.*/\\1/p" <<< "$s"
Você pode considerar isso awk:
awk -F '[[:blank:]]*=[[:blank:]]*' '$1 == "$OC_VersionString" {
gsub(/[^.0-9]+/, "", $2) print $2
}' file.php
20.0.1