Вы могли искать std::cout
только, когда этим не предшествуют //
. Синтаксис Regexp не включает отрицание; каждый regexp может отрицаться путем выписывания его дополнения, но дополнение может стать огромным. Здесь, это не является слишком большим:
grep -rl -E '^/?([^/]/?)*std::cout' .
Можно также перечислить все случаи std::cout
и отфильтруйте далеко случаи //.*std::cout
, но обратите внимание, что это скроет вещи как std::cout << foo; // std::cout << bar;
.
grep -r 'std::cout' . | grep -vE '^[^:]*:.*//.*std::cout' | sed -e 's/:.*//'
С другой стороны, можно выполнить инструмент, который анализирует код C++, такой как ctags.
grep -r 'std::cout' . | grep -v '^[ \t]*//'
только опустит закомментированные строки и не все строки, которые имеют комментарий к ним.
-l
подавляет нормальный вывод, таким образом, Вы просто отфильтровали бы имена файлов, содержащие комментарии.
–
30.09.2011, 19:04
Дополняя ответ Жиля , для одного файла , вы можете просто сделать все это в Sed с большим количеством большая простота:
sed -n 'h;s|//.*||;/std::cout/{g;p;}' file.c
Другими словами, просто сохраните ( h
старый) строку, удалите любой завершающий комментарий, затем, если строка соответствует желаемому шаблону, g
и сохраненный копию строки и распечатайте ее.
Однако для рекурсивного grep используйте решение Gille.