เมื่อฉันค้นหาแท็บในไฟล์ที่มี (จ) grep ฉันจะใช้แท็บครอก ( ^v + <tab>
) ฉันไม่สามารถใช้\t
แทนแท็บในนิพจน์ทั่วไปได้ ด้วยเช่น sed การแสดงออกนี้ทำงานได้ดีมาก
ดังนั้นจึงมีความเป็นไปได้ที่จะใช้การทดแทน<tab>
ที่ไม่ได้มาจากที่\t
ใด
เมื่อฉันค้นหาแท็บในไฟล์ที่มี (จ) grep ฉันจะใช้แท็บครอก ( ^v + <tab>
) ฉันไม่สามารถใช้\t
แทนแท็บในนิพจน์ทั่วไปได้ ด้วยเช่น sed การแสดงออกนี้ทำงานได้ดีมาก
ดังนั้นจึงมีความเป็นไปได้ที่จะใช้การทดแทน<tab>
ที่ไม่ได้มาจากที่\t
ใด
คำตอบ:
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 และระบบอื่น ๆ
grep $'\t' foo.txt
(แต่ฉันมักจะเขียนfgrep
แทนgrep
)
grep "$(printf '\t')${myvar}" foo.txt
ผมใช้ มันใช้งานได้ดี ด้วยความพยายามสองสามครั้งฉันไม่สามารถรับแบบฟอร์มสุดท้ายให้ทำงานได้
grep
ไม่สามารถแปลความหมาย\t
ว่าเป็นแท็บได้อย่างเงียบ ๆ? POSIX ต้องการให้มีความ\t
หมายว่าอย่างอื่นหรือไม่? บางทีมันควรจะตรงกับตัวอักษร\
ตามด้วยt
?
This is highly experimental and grep -P may warn of unimplemented features.
อาจไม่ควรใช้-P
ในระบบดั้งเดิม printf
ทางเลือกที่ดีกว่า
มันไม่ได้เป็นคำตอบที่คุณต้องการจะได้ยินอย่างแน่นอน แต่มีการใช้งานลำดับการหลบหนีที่เป็นไปได้โดยการทุบตี
command | grep $'\t'
(อย่าใส่ลงในเครื่องหมายคำพูดคู่!)
grep $'\t'
ๆ
awk '/\t/'
เป็นวิธีแก้ปัญหาที่ฉันชอบ:
printf 'a\t\nb' | awk '/\t/'
ผลลัพธ์: a\t
.
หนึ่งสามารถหันไปใช้รหัสฐานสิบหก ascii สำหรับแท็บ:
$ echo "one"$'\t'"two" > input.txt
$ grep -P "\x9" input.txt
one two
$ grep $'\x9' input.txt
one two