Исключение результатов, содержащих '//' от поисков grep

Судите ЛАМЕ, я должен предупредить Вас, что перекодирование может (вероятно), привести к качественной потере.

2
30.09.2011, 17:11
4 ответа

Вы могли искать 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.

3
27.01.2020, 22:01
egrep -r '^([^/]/?)*std::cout' .
1
27.01.2020, 22:01
grep -r 'std::cout' . | grep -v '^[ \t]*//'

только опустит закомментированные строки и не все строки, которые имеют комментарий к ним.

0
27.01.2020, 22:01
  • 1
    -l подавляет нормальный вывод, таким образом, Вы просто отфильтровали бы имена файлов, содержащие комментарии. –   30.09.2011, 19:04

Дополняя ответ Жиля , для одного файла , вы можете просто сделать все это в Sed с большим количеством большая простота:

sed -n 'h;s|//.*||;/std::cout/{g;p;}' file.c

Другими словами, просто сохраните ( h старый) строку, удалите любой завершающий комментарий, затем, если строка соответствует желаемому шаблону, g и сохраненный копию строки и распечатайте ее.

Однако для рекурсивного grep используйте решение Gille.

0
27.01.2020, 22:01

Теги

Похожие вопросы