awk regexp ตรงกันบนแท็บเดียวเท่านั้น

ฉันมีไฟล์อินพุตอย่างง่ายสำหรับ awk เรียกว่า tabmatch.input และมีเนื้อหาด้านล่าง:

        : (test1
            : (test2

บรรทัดแรกมีหนึ่งแท็บ ตามด้วย /// และบรรทัดที่สองมีสองแท็บ ตามด้วย /// คำว่า "test1" และ "test2" อาจเป็นคำใดก็ได้ในไฟล์จริงที่ฉันพยายามแยกวิเคราะห์

ฉันกำลังพยายามสร้าง regexp ที่ตรงกับบรรทัดแรก แต่ไม่ใช่บรรทัดที่สอง ตัวอย่างเช่นฉันลองสิ่งนี้:

user@lab-client:~$ cat tabmatch.input |awk '/\t: \(test/ {  {print $2} }'
(test1
(test2

แม้ว่าจะระบุเพียง \t เพียงหนึ่งรายการแล้วตามด้วย quot; แต่ก็ยังตรงกับสอง \t และ quot; ถ้าฉันจับคู่สอง \t แทน มันจะจับคู่เฉพาะบรรทัดที่สองซึ่งมีสอง \t

user@lab-client:~$ cat tabmatch.input |awk '/\t\t: \(test/ {  {print $2} }'
(test2

ฉันได้ดูไปรอบ ๆ แล้ว แต่ไม่พบว่าทำไม \t ตรงกับหลาย ๆ \t หรือวิธีทำให้ตรงกันเพียงอันเดียว

ความพยายามอื่นที่ฉันทำคือ:

user@lab-client:~$ cat tabmatch.input |awk '/[\t]: \(test/ {  {print $2} }'
(test1
(test2

user@lab-client:~$ cat tabmatch.input |awk '/[\t]?: \(test/ {  {print $2} }'
(test1
(test2

awk
person Johnathan    schedule 11.10.2016    source แหล่งที่มา


คำตอบ (1)


เส้นทั้งสองของคุณตรงกับรูปแบบ

หากคุณต้องการจับคู่เพียงแท็บเดียวจากจุดเริ่มต้นของบรรทัด คุณต้องเพิ่มจุดยึด ^:

awk '/^\t: \(test/ { print $2 }' tabmatch.input

ฉันถอดเหล็กปีกกาด้านในออกเนื่องจากไม่ได้มีประโยชน์อะไร

โปรดทราบว่า awk สามารถอ่านไฟล์ทั้งหมดได้ด้วยตัวเอง ดังนั้นคุณไม่จำเป็นต้องไปป์ข้อมูลไปยังไฟล์โดยใช้ cat

person Tom Fenech    schedule 11.10.2016
comment
ฮ่าฮ่า เมื่อคุณพูดมันก็สมเหตุสมผลทันที ฉันไม่รู้ว่าฉันไม่ได้คิดอย่างนั้น ขอบคุณ! จะทำเครื่องหมายให้คุณตอบว่าตกลงใน 10 นาทีเมื่อเป็นไปได้ - person Johnathan; 11.10.2016