Awk RegEx devolvendo nada?

Oct 30 2020

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

2 RavinderSingh13 Oct 30 2020 at 14:01

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.

2 WiktorStribiżew Oct 30 2020 at 14:08

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

Você pode considerar isso awk:

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