Jak mogę grepować w plikach źródłowych dla jakiegoś tekstu?

8

W tej chwili używam dwóch poleceń, jestem pewien, że musi być lepszy sposób ...

wim@wim-acer:~/ffmpeg$ find . -name "*.h" -print0 | xargs -0 grep -i invalid\ preset
wim@wim-acer:~/ffmpeg$ find . -name "*.c" -print0 | xargs -0 grep -i invalid\ preset
wim
źródło
1
nie -name '*.[ch]'działa?
glenn jackman

Odpowiedzi:

10

ack (lub, w Debianie / Ubuntu, ack-grep) zignoruje pliki inne niż źródła, takie jak kontrola wersji lub pliki binarne. Bardzo przydatne.

aby wyszukać tylko pliki .c i .h, jak wyżej:

ack-grep -i --cc "invalid preset"

--cc(dłuższa forma jest --type cc) wygląda tylko na .c .h & .xs plików. Pełna lista typów plików jest widoczna w ack-grep --help type. Przez większość czasu nie będzie to szczególnie potrzebne --type, ponieważ zazwyczaj będą zawierały tylko pliki do przeszukania, a następnie pliki domyślnie niewidoczne, takie jak pliki binarne, kopie zapasowe i pliki kontroli wersji.

Alister Bulman
źródło
5

Sam grepprogram może wyszukiwać rekurencyjnie, a także akceptuje opcję wyszukiwania tylko niektórych plików. Poniższe jest równoważne z dwoma findpoleceniami.

grep -Ri --include=*.[ch] invalid\ preset .
garyjohn
źródło
To zadziałało, kiedy pozbyłem się nawiasów
Mike
1

Polecenie find może wywołać grep.

find . \( -name "*.c" -o -name "*.h" \) -exec grep -i "invalid preset" {} \; -print

i ich odmiany.

Keith
źródło
Zmieniłem to na oczywistą odmianę. ;-)
Keith,
0

Mogę dodać coś takiego do twojego ~/.bashrc

alias cppgrep='grep -Ri "--include=*.[hc]" "--include=*.cpp" "--include=*.hpp"'
AlejandroVD
źródło