Виключіть файли, у яких дуже довгі рядки тексту, з греп-виводу


18

Я часто запускаю команди grep, щоб знайти речі в своєму коді, але проблема веб-проектів полягає в тому, що часто будуть стиснуті файли JavaScript і CSS, які створюють один величезний рядок тексту, так що якщо буде знайдено збіг, все вікно терміналу заповнене більше 1000 рядків, що робить надзвичайно непрактичним пошук того, що я шукаю.

То чи існує спосіб уникнути файлів, у яких написано одиночні рядки тексту понад 200 символів?

Відповіді:


20

З GNU grep та xargs:

grep -rLZE '.{200}' . | xargs -r0 grep pattern

Крім того, ви можете вирізати вихід grep:

grep -r pattern . | cut -c1-"$COLUMNS"

або скажіть своєму терміналу не загортати текст, якщо він підтримує його:

tput rmam
grep -r pattern .

або використовувати less -S

grep -r pattern . | less -S

3
Використовуючи регулярний вираз із першого прикладу, перетворюючи в grep з інвертованим збігом,, також ... | grep -v -E '.{200}'працює. Наприклад, щоб знайти всі рядки * .js файлів у поточному режимі з ".name", розміром яких не більше 200 символів: find . -name "*.js" -exec grep -H \\.name {} \; | grep -v -E '.{200}'
Gary S. Weaver

3

Варіант 1: Ви можете виключити файли, що відповідають певному шаблону:

grep --exclude='*.min.*'

Це виключить script.min.jsі style.min.css... Інший grepваріант включає --exclude-from=FILEі--exclude-dir=DIR

Варіант 2: Я не впевнений, чи це практично, але ви можете cutспочатку 200 символів кожного рядка, а потім grepїх:

grep -H [OPTIONS] PATTERN [FILE...] | cut -c1-200 | grep PATTERN

Перший grepвідповідає початковому збігу та виводить ім'я файлу та рядок, другий забезпечує те, що PATTERNвін все ще є після cutвідтінку рядків.


2

У такій ситуації мені подобається схрещувати візерунок із контекстом сусідства (скажімо 30 знаків):

grep -Po '.{0,30}pattern.{0,30}' *.js
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.