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