Як я грепаю без провідних пробілів?


17

Я проглядаю велику базу коду, і провідні пробіли та табуляції здаються досить роздратованими. Чи є спосіб позбутися від нього?

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, у виході. Оновлено запитання
Андрій

Відповіді:


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' (hex 01) ... або ти маєш на увазі щось інше?
Пітер.O

Я маю на увазі, що там можуть бути провідні таблиці \t, а також провідні пробіли\s
Ендрю

... виправлено. Змінено `` на [[:space:]]... Якщо ви хочете враховувати лише TAB та SPACE, а не всі пробіли, використовуйте це замість цього:[ \t]
Peter.O

6

Ви можете просто усунути їх за допомогою sed

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

Це видалить провідні пробіли з виводу


1
Це не матиме жодного ефекту, оскільки на початку жодного рядка у висновку немає пробілів.
Абхішек A

6

Припустимо, що ви шукаєте шаблон re (основний регулярний вираз) в одному файлі, і ви хочете позбавити провідний пробіл з усіх відповідних рядків:

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

(насправді це знімає спочатку всі провідні пробіли, а потім шукає шаблон, але результат той самий)

Щоб після обробки обробити grep замість цього результат (як у вашому відредагованому запитанні):

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

Шаблон [[:blank:]]*відповідає нулю або більше пробілів або вкладок.


Дякуємо, останній фрагмент працює чудово. Чи є спосіб зберегти вихідний колір?
Андрій

Колір? Називайте мене старомодно, але мій термінал суворо чорний і оранжевий ... (це "я не знаю").
Кусалаланда

3
Використовуйте --color = завжди (припускаючи GNU grep) для виклику grep. Виклик sed не вилучає кольори, сам grep не використовує колір, коли вихід не переходить до терміналу (за замовчуванням --color = auto). "завжди" змушує це, ну, завжди використовувати колір.
Юрген А. Ерхард

@Jurgen, дякую, але з --color=alwaysцим regexp не працює: /
Ендрю

1
О, шути, ти маєш рацію. Це тому, що між товстою кишкою та пробілом є контрольні послідовності (для кольору). Ви можете помістити послідовності втечі у виклик sed (послідовність - це, принаймні, для стандартної емуляції vt100 (xterm, екран тощо) "\ 033 [m \ 033 [K". Я думаю.; D
Юрген A Ерхард

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.