Awk RegEx mengembalikan nada?

Oct 30 2020

Jadi saya memiliki teks ini dalam sebuah file bernama 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';

dan saya mencoba membuat awk untuk mengembalikan nomor versi dari baris:

$OC_VersionString = '20.0.1';

menggunakan (sejauh ini) perintah ini:

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

Tapi, ketika saya menggunakannya, tidak ada yang dikembalikan?

Ini pertama kali gw pake awk, sooo, ... BRE terasa "awk-warrrd" nerk nerk nerk

Adakah yang bisa menyelesaikan ini?

Jawaban

2 RavinderSingh13 Oct 30 2020 at 14:01

Bisakah Anda mencoba mengikuti. Ditulis dan diuji dengan sampel yang ditampilkan di GNU awk.

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


Solusi yang lebih umum: Menambahkan satu solusi umum lagi, diuji di GNU awkyang akan menangkap nomor versi jika memiliki versi yang lebih kecil misalnya -> 20.2.0.1(sebagai contoh) juga.

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

Penjelasan singkat: Memeriksa kondisi/^\$OC_VersionString/untuk memeriksa apakah sebuah garis dimulai dari/$OC_VersionString/kemudian memeriksa bahwa ekspresi reguler hadir dalammatchfungsiawk. matchadalah fungsi default diawkmana kami menyediakan regex untuk dicocokkan dan setelah kami mencocokkan regex itu menetapkan nilaiRSTARTdanRLENGTHvariabel default. Di manaRSTARTtitik indeks awal dari regex yang cocok DANRLENGTHadalah panjang dari regex yang cocok. Kemudian mencetak sub string dari baris saat ini yang titik awalnyaRSTARTsampai nilaiRLENGTH.

2 WiktorStribiżew Oct 30 2020 at 14:08

Anda tidak dapat menggunakan kelas karakter POSIX kosong, Anda harus membungkusnya dengan ekspresi braket, misalnya [:digit:]=> [[:digit:]], dll.

Kemudian, Anda dapat melihat nilai yang Anda inginkan terletak di Bidang 3, saat Anda menggunakan $1untuk mencari kecocokan. Dan terakhir, Anda tidak mengekstrak bidang, Anda mencetak seluruh data dengan {print $0}. Juga, itu akan tetap berisi 'dan ';jika Anda tidak menggunakan gsub.

Jika Anda ingin memperbaiki pendekatan Anda, Anda dapat menggunakan

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

Lihat demo onlineawk .

Namun, sedsolusi solusi terlihat lebih sederhana di sini:

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

Anda dapat mempertimbangkan ini awk:

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