Как я grep без ведущих пробелов?


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) ... или вы имеете в виду что-то еще?
Peter.O

Я имею в виду, что могут быть как ведущие таблицы, \tтак и пробелы\s
Эндрю

... фиксированный. Изменено `` на [[:space:]]... Если вы хотите учитывать только TAB и SPACE, а не все пробелы, используйте вместо этого:[ \t]
Peter.O

6

Вы можете просто устранить их, используя sed

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

Это удалит ведущие пробелы из вывода


1
Это не будет иметь никакого эффекта, так как в начале строки в выходных данных нет пробелов.
Абхишек А

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). «всегда» заставляет его, ну, всегда использовать цвет.
Юрген А. Эрхард

@ Юрген, спасибо, но с --color=alwaysэтим регулярное выражение не работает: /
Эндрю

1
О, чёрт, ты прав. Это потому, что между двоеточием и пробелом есть управляющие последовательности (для цвета). Вы могли бы поместить escape-последовательности в вызов sed (последовательность, по крайней мере, для стандартной болтовой эмуляции vt100 (xterm, screen и т. Д.) "\ 033 [m \ 033 [K". Я думаю.; D
Jürgen A Эрхард

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.