จะใช้ regex เป็นตัวคั่นฟิลด์ใน awk ได้อย่างไร


16

ฉันพยายามที่จะใช้ regex เป็น seperator awkในสนาม จากการอ่านของฉันนี้เป็นไปได้ แต่ฉันไม่สามารถรับไวยากรณ์ที่ถูกต้อง

rpm -qa | awk '{ 'FS == [0-9]' ; print $1 }'
awk: cmd. line:1: { FS
awk: cmd. line:1:     ^ unexpected newline or end of string

คิด? เป้าหมายหากไม่ได้รับการยกเว้นคือการได้รับรายชื่อซอฟต์แวร์ที่ไม่มีหมายเลขเวอร์ชั่น

คำตอบ:


25

คุณลบล้างคำพูดและไวยากรณ์ของคุณ ในการตั้งค่าตัวคั่นฟิลด์อินพุตวิธีที่ง่ายที่สุดคือใช้-Fตัวเลือกในบรรทัดคำสั่ง:

awk -F '[0-9]' '{ print $1 }'

หรือ

awk -F '[[:digit:]]' '{ print $1 }'

สิ่งนี้จะใช้ตัวเลขใด ๆ เป็นตัวคั่นฟิลด์อินพุตจากนั้นเอาต์พุตฟิลด์แรกจากแต่ละบรรทัด

[0-9]และ[[:digit:]]การแสดงออกที่ไม่ได้ค่อนข้างเหมือนกันขึ้นอยู่กับสถานที่ของคุณ ดู " ความแตกต่างระหว่าง [0-9], [[: หลัก:]] และ \ d "

หนึ่งสามารถตั้งค่าFSในawkโปรแกรมเอง โดยปกติจะทำในBEGINบล็อกเนื่องจากเป็นการเริ่มต้นครั้งเดียว:

awk 'BEGIN { FS = "[0-9]" } { print $1 }'

โปรดทราบว่าไม่สามารถใช้เครื่องหมายคำพูดเดี่ยวในสตริงที่มีเครื่องหมายคำพูดเดี่ยวในเชลล์และawkสตริงนั้นใช้เครื่องหมายคำพูดคู่เสมอ


12

+1 สำหรับคำตอบของ Kusalananda อีกทางหนึ่งตัวแปร FS สามารถตั้งค่าในบล็อก BEGIN:

awk 'BEGIN {FS="[0-9]"} {print $1}'

การเปลี่ยน FS ในบล็อกการดำเนินการจะไม่มีผลจนกว่าจะมีการอ่านบรรทัดถัดไป

$ printf "%s\n" "abc123 def456" "ghi789 jkl0" | awk '{FS="[0-9]"; print $1}'
abc123
ghi

ข้อผิดพลาดอื่น ๆ ในคำถาม:

  • ไม่สามารถใช้เครื่องหมายคำพูดเดี่ยวในสตริงที่มีเครื่องหมายคำพูดเดี่ยว
  • ==เป็นตัวดำเนินการเปรียบเทียบ=สำหรับการกำหนดตัวแปร

1
"การเปลี่ยน FS ในบล็อกการกระทำจะไม่มีผลจนกว่าจะมีการอ่านบรรทัดถัดไป" ฉันดูข้อมูลทั้งหมดแล้ว
Samizdis

1
บวก: ไม่สามารถใช้อัญประกาศเดี่ยวสำหรับค่าสตริงใน awk แม้ว่าคุณจะส่งผ่านจากเชลล์ได้อย่างถูกต้อง
dave_thompson_085
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.