วิธี grep สำหรับแท็บโดยไม่ต้องใช้แท็บตัวอักษรและทำไม \ t ไม่ทำงาน


146

เมื่อฉันค้นหาแท็บในไฟล์ที่มี (จ) grep ฉันจะใช้แท็บครอก ( ^v + <tab>) ฉันไม่สามารถใช้\tแทนแท็บในนิพจน์ทั่วไปได้ ด้วยเช่น sed การแสดงออกนี้ทำงานได้ดีมาก

ดังนั้นจึงมีความเป็นไปได้ที่จะใช้การทดแทน<tab>ที่ไม่ได้มาจากที่\tใด


คำตอบ:


206

grep คือการใช้การแสดงออกปกติตามที่กำหนดโดยPOSIX ด้วยเหตุผลใดก็ตาม POSIX ไม่ได้กำหนด\tเป็นแท็บ

คุณมีทางเลือกหลายประการ:

  • บอก grep ให้ใช้นิพจน์ทั่วไปตามที่กำหนดโดย perl (perl มี\tตามแท็บ):

    grep -P "\t" foo.txt

    หน้าคนเตือนว่านี่เป็นคุณสมบัติ "ทดลอง" อย่างน้อย\tดูเหมือนว่าจะทำงานได้ดี แต่คุณสมบัติขั้นสูงเพิ่มเติม Perl อาจไม่

  • ใช้ printf เพื่อพิมพ์อักขระแท็บสำหรับคุณ:

    grep "$(printf '\t')" foo.txt
  • ใช้อักขระแท็บตัวอักษร:

    grep "^V<tab>" foo.txt

    ที่อยู่: ชนิดgrep "จากนั้นกดปุ่มctrl+vจากนั้นกดปุ่มจากนั้นพิมพ์tab " foo.txtการกดctrl+vในเทอร์มินัลจะทำให้คีย์ถัดไปถูกใช้เป็นคำต่อคำ นั่นหมายถึงว่าเทอร์มินัลจะแทรกอักขระแท็บแทนที่จะเรียกใช้ฟังก์ชันบางอย่างที่ผูกไว้กับคีย์แท็บ

  • ใช้คุณสมบัติการอ้างอิง ansi cของ bash:

    grep $'\t' foo.txt

    สิ่งนี้ไม่สามารถใช้ได้กับทุกเชลล์

  • ใช้ awk:

    awk '/\t/'
  • ใช้ sed:

    sed -n '/\t/p'

ดูบทความวิกิพีเดียเกี่ยวกับการแสดงออกปกติสำหรับภาพรวมของการเรียนตัวละครที่กำหนดไว้ใน POSIX และระบบอื่น ๆ


จากคำตอบของ enzotib ให้ฉันเพิ่มสิ่งต่อไปนี้: grep $'\t' foo.txt(แต่ฉันมักจะเขียนfgrepแทนgrep)
Walter Tross

ฉันต้องการสิ่งนี้บวกกับการใช้ค่าของตัวแปรสภาพแวดล้อม grep "$(printf '\t')${myvar}" foo.txtผมใช้ มันใช้งานได้ดี ด้วยความพยายามสองสามครั้งฉันไม่สามารถรับแบบฟอร์มสุดท้ายให้ทำงานได้
sancho.s

1
มีเหตุผลใดที่ธรรมดาgrepไม่สามารถแปลความหมาย\tว่าเป็นแท็บได้อย่างเงียบ ๆ? POSIX ต้องการให้มีความ\tหมายว่าอย่างอื่นหรือไม่? บางทีมันควรจะตรงกับตัวอักษร\ ตามด้วยt?
Aaron McDaid

บางทีน่าสังเกตว่า BSD (รวมถึง OSX) grep ขาดตัวเลือก -P
TextGeek

จากหน้าคนThis is highly experimental and grep -P may warn of unimplemented features.อาจไม่ควรใช้-Pในระบบดั้งเดิม printfทางเลือกที่ดีกว่า
Avindra Goolcharan

13

มันไม่ได้เป็นคำตอบที่คุณต้องการจะได้ยินอย่างแน่นอน แต่มีการใช้งานลำดับการหลบหนีที่เป็นไปได้โดยการทุบตี

command | grep $'\t'

(อย่าใส่ลงในเครื่องหมายคำพูดคู่!)


1
ไม่จำเป็นต้องมี -E (สิ่งที่ถูกค้นหาคือไม่มี regex) นอกจากนี้ยังไม่จำเป็นต้องไพพ์จากคำสั่ง ที่กล่าวว่าขอขอบคุณสำหรับการชี้ให้เห็นคุณลักษณะนี้มองข้ามค่อนข้างทุบตี (สายเดียวที่ยกมานำหน้าด้วย $)
วอลเตอร์ Tross

2
แน่นอนฉันขอแนะนำให้ @enzotib แก้ไขคำตอบให้ง่ายgrep $'\t'
Teemu Leisti

ควรเน้นว่านี่เป็นคุณลักษณะของการทุบตีและจะทำสิ่งผิดถ้าถูกดำเนินการโดยเชลล์อื่น (เช่นเส้นประซึ่งเป็นค่าเริ่มต้นสำหรับเชลล์สคริปต์ใน Ubuntu และอื่น ๆ )
xjcl


1

หนึ่งสามารถหันไปใช้รหัสฐานสิบหก ascii สำหรับแท็บ:

$ echo "one"$'\t'"two" > input.txt                                 

$ grep -P "\x9" input.txt                                          
one two

$ grep $'\x9' input.txt                                            
one two
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.