Awk RegEx คืนค่า nada?
ดังนั้นฉันจึงมีข้อความนี้ในไฟล์ชื่อ 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';
และฉันกำลังพยายามรับ awk เพื่อส่งคืนหมายเลขเวอร์ชันจากบรรทัด:
$OC_VersionString = '20.0.1';
โดยใช้ (จนถึงปัจจุบัน) คำสั่งนี้:
awk -e '$1 ~ /[:digit:]+[:punct:][:digit:]+[:punct:][:digit:]+/ {print $0}' version.php
แต่เมื่อฉันใช้มันไม่มีอะไรได้รับคืน?
นี่เป็นครั้งแรกของฉันที่ใช้ awk, sooo, ... BRE รู้สึก "awk-warrrd" nerk nerk nerk
ใครสามารถแยกแยะสิ่งนี้ออก?
คำตอบ
คุณช่วยลองทำตามได้ไหม เขียนและทดสอบกับกลุ่มตัวอย่างที่แสดงใน awkGNU
awk '/^\$OC_VersionString/ && match($0,/\047[0-9]+\.[0-9]+\.[0-9]+\047/){
print substr($0,RSTART+1,RLENGTH-2)
}' Input_file
โซลูชันทั่วไปเพิ่มเติม: การเพิ่มโซลูชันทั่วไปอีกหนึ่งโซลูชันที่ทดสอบใน GNU awkซึ่งจะจับหมายเลขเวอร์ชันในกรณีที่มีเวอร์ชันรองมากกว่าเช่น -> 20.2.0.1(เป็นตัวอย่าง) ด้วย
awk '
/^\$OC_VersionString/ && match($0,/\047([0-9]+\.){1,}[0-9]+\047/){ print substr($0,RSTART+1,RLENGTH-2)
}' Input_file
คำอธิบายคร่าวๆ:เงื่อนไขการตรวจสอบ/^\$OC_VersionString/เพื่อตรวจสอบว่าเป็นเส้นเริ่มต้น/$OC_VersionString/แล้วการตรวจสอบว่า regex อยู่ในการทำงานของmatch เป็นฟังก์ชันเริ่มต้นที่เราให้ regex ที่จะจับคู่และเมื่อเราจับคู่ regex แล้วจะกำหนดค่าและตัวแปรเริ่มต้น จุดเริ่มต้นดัชนีของ regex ที่ตรงกันอยู่ที่ไหนและคือความยาวของ regex ที่ตรงกัน แล้วพิมพ์สตริงย่อยจากบรรทัดปัจจุบันที่มีจุดเริ่มต้นคือจนถึงค่าของawkmatchawkRSTARTRLENGTHRSTARTRLENGTHRSTARTRLENGTH
คุณไม่สามารถใช้คลาสอักขระ POSIX เปล่าได้คุณควรพันด้วยนิพจน์วงเล็บเช่น[:digit:]=> [[:digit:]]เป็นต้น
จากนั้นคุณจะเห็นค่าที่คุณต้องการอยู่ในฟิลด์ 3 ในขณะที่คุณใช้$1ค้นหารายการที่ตรงกัน {print $0}และสุดท้ายคุณจะไม่ได้แยกสาขาที่คุณพิมพ์บันทึกทั้งหมดที่มี นอกจากนี้ก็จะยังคงมี'และถ้าคุณไม่ได้ใช้';gsub
หากคุณต้องการแก้ไขแนวทางของคุณคุณสามารถใช้
s="\$OC_VersionString = '20.0.1';" awk '$3 ~ /[[:digit:]]+[[:punct:]][[:digit:]]+[[:punct:]][[:digit:]]+/{gsub(/['"'"';]/,"", $3);print $3}' <<< "$s"
# => 20.0.1
ดูออนไลน์awkสาธิต
อย่างไรก็ตามsedวิธีแก้ปัญหาดูง่ายกว่าที่นี่:
sed -n "s/.*'\\(.*\\)'.*/\\1/p" <<< "$s"
sed -n "s/.*'\\([0-9.]*\\)'.*/\\1/p" <<< "$s"
คุณอาจพิจารณาสิ่งนี้awk:
awk -F '[[:blank:]]*=[[:blank:]]*' '$1 == "$OC_VersionString" {
gsub(/[^.0-9]+/, "", $2) print $2
}' file.php
20.0.1