Как я 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

Peter.O
источник
хорошая работа! небольшая проблема, однако, вы забыли сопоставить \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 Эрхард
-1

Файл sed -n '/ pattern / p' | sed -r "s / \ s + // g"

Правин Кумар Б.С.
источник