ฉันจะ grep โดยไม่มีช่องว่างนำหน้าได้อย่างไร


17

ฉันกำลัง greping ผ่าน codebase ขนาดใหญ่และ whitespaces และ tabulation ชั้นนำดูเหมือนจะค่อนข้างน่ารำคาญ มีวิธีใดที่จะกำจัดมันได้หรือไม่?

grep -R "something" ./

เช่นแทนที่จะเป็น:

foo/bar.cpp:                       qwertyuiosomethingoi
foo/bar/baz.h:                          43rfsgsomethingdrfg
bar/bar.cpp:            1234edwssomethingczd

ฉันต้องการได้รับ:

foo/bar.cpp: qwertyuiosomethingoi
foo/bar/baz.h: 43rfsgdsomethingrfg
bar/bar.cpp: 1234edwssomethingczd

หรือดีกว่า:

foo/bar.cpp:   qwertyuisomethingooi
foo/bar/baz.h: 43rfsgdrsomethingfg
bar/bar.cpp:   1234edwssomethingczd

กำจัดมันที่ไหน ในการส่งออก? ในรูปแบบการค้นหา?
Ignacio Vazquez-Abrams

@Ignacio ในผลลัพธ์ อัปเดตคำถาม
แอนดรูว์

คำตอบ:


4

สร้างไฟล์ทดสอบ

echo -e "\t   foo-somethingfoo" >something.foo
echo "    bar-bar-somethingbar" >something.bar_bar
echo "baz-baz-baz-somethingbaz" >something.baz_baz_baz
echo "  spaces    something  s" >something.spaces

ผลิตสีเต็มรุ่งโรจน์ :)

grep --colour=always "something" something.* | 
 sed -re  's/^([^:]+):(\x1b\[m\x1b\[K)[[:space:]]*(.*)/\1\x01\2\3/' |
   column -s $'\x01' -t

เอาท์พุท (เรียกใช้เพื่อให้ได้สี)

something.bar_bar      bar-bar-somethingbar
something.baz_baz_baz  baz-baz-baz-somethingbaz
something.foo          foo-somethingfoo
something.spaces       spaces    something  s

การทดสอบในgnome-terminal, konsole, terminator,xterm


การทำงานที่ดี! ปัญหาเล็กน้อย แต่คุณลืมที่จะจับคู่\tตัวละคร
แอนดรูว์

\t? ... มันไม่ได้ใช้\tสำหรับเครื่องแยกมันใช้ $ '\ x01' (ฐานสิบหก 01) ... หรือคุณหมายถึงอย่างอื่นหรือ
Peter.O

ฉันหมายความว่าอาจมีการจัดระเบียบตารางนำ\tเช่นเดียวกับช่องว่างนำ\s
Andrew

... แก้ไขแล้ว. เปลี่ยน `` เป็น[[:space:]]... หากคุณต้องการพิจารณาเฉพาะ TAB และ SPACE และไม่ใช่พื้นที่ว่างทั้งหมดให้ใช้สิ่งนี้แทน:[ \t]
Peter.O

6

คุณสามารถกำจัดพวกเขาโดยใช้ sed

grep blah filename.foo | sed -e 's/^[ \t]*//'

ที่จะลบช่องว่างนำหน้าออกจากผลลัพธ์


1
สิ่งนี้จะไม่มีผลกระทบใด ๆ เนื่องจากไม่มีช่องว่างที่จุดเริ่มต้นของบรรทัดใด ๆ ในเอาต์พุต
Abhishek A

6

สมมติว่าคุณกำลังมองหารูปแบบre(นิพจน์ปกติพื้นฐาน) ในไฟล์เดียวและคุณต้องการตัดพื้นที่ว่างนำหน้าจากบรรทัดที่ตรงกันทั้งหมด:

sed -n -e 's/^[[:blank:]]*//' -e '/re/p' thefile.c

(อันที่จริงแถบนี้จะนำช่องว่างที่นำหน้ามาก่อนแล้วจึงมองหารูปแบบ แต่ผลลัพธ์จะเหมือนกัน)

หากต้องการประมวลgrepผลผลลัพธ์แทน (เช่นในคำถามที่แก้ไขของคุณ)

grep re * | sed 's/:[[:blank:]]*/: /'

รูปแบบ[[:blank:]]*ตรงกับศูนย์หรือแท็บหรือมากกว่านั้น


ขอขอบคุณข้อมูลโค้ดสุดท้ายนั้นใช้ได้ดี มีวิธีการรักษาสีเอาท์พุทหรือไม่?
แอนดรู

สี? โทรหาฉันแบบเก่า แต่เทอร์มินัลของฉันเป็นสีดำและสีส้มอย่างเคร่งครัด ... (นั่นคือ "ฉันไม่รู้")
Kusalananda

3
ใช้ --color = always (สมมติว่า grep GNU) ในการเรียก grep การเรียกสายไม่ได้ลบสี แต่เป็น grep ตัวเองที่ไม่ใช้สีเมื่อเอาต์พุตไม่ไปที่เทอร์มินัล (โดยค่าเริ่มต้นคือ --color = auto) "เสมอ" กองกำลังมันจะดีเสมอใช้สี
Jürgen A. Erhard

@ Jurgen ขอบคุณ แต่ด้วย--color=alwaysregexp นี้ไม่ทำงาน: /
แอนดรู

1
โอ้โหคุณพูดถูกแล้ว นั่นเป็นเพราะมีลำดับการควบคุม (สำหรับสี) ระหว่างเครื่องหมายจุดคู่และช่องว่าง คุณสามารถใส่ลำดับ escape ลงในการเรียก sed (ลำดับคืออย่างน้อยสำหรับการจำลอง vt100 bog-standard (xterm, screen, etc) "\ 033 [m \ 033 [K" ฉันคิดว่า; D
Jürgen A Erhard

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