2

Я нахожусь на macOS и хотел бы использовать grep (или подобный инструмент), чтобы найти уникальные вхождения определенного шаблона в базе кода. Например, для поиска всех вызовов console.somemethod() в JavaScript, которые я разработал:

grep -oiER "console\.([a-z]+)\(" . | sort -u

Но это дает мне результаты в виде:

./tools/svg-inject/node_modules/with/node_modules/acorn/src/bin/acorn.js:console.log(
./tools/svg-inject/node_modules/wordwrap/README.markdown:console.log(
./tools/svg-inject/node_modules/wordwrap/example/center.js:console.log(
./tools/svg-inject/node_modules/wordwrap/example/meat.js:console.log(
./tools/svg-inject/node_modules/yargs/README.md:console.dir(
./tools/svg-inject/node_modules/yargs/README.md:console.log(
./tools/svg-inject/node_modules/yargs/index.js:console.log(
./tools/svg-inject/node_modules/yargs/lib/usage.js:console.error(
./tools/svg-inject/node_modules/yargs/lib/usage.js:console.log(
./webpack.config.js:console.info(
Console.sendTo(
console.error(
console.log(
console.markTimeline(
console.reactStackEnd(
console.timeEnd(
console.trace(
console.warn(

Я хотел бы ограничить его уникальные матчи только ([a-z]+) групп:

info
sendTo
error
log
markTimeline
reactStackEnd
timeEnd
trace
warn

Извиняюсь, если я перефразирую старый вопрос!

1 ответ1

2

Используйте параметр -P для регулярного выражения perl с директивой \K в регулярном выражении, которая исключит совпадение предыдущей строковой части из результата:

grep -ioP "console\.\K[a-z]+" file.txt
log
log
log
log
dir
log
log
error
log
info
sendTo
error
log
markTimeline
reactStackEnd
timeEnd
trace
warn

Я поместил ваш пример строки в file.txt для тестирования.

Чтобы ограничить уникальное вхождение:

grep -ioP "console\.\K[a-z]+" file.txt | sort -u
dir
error
info
log
markTimeline
reactStackEnd
sendTo
timeEnd
trace
warn

Другое решение -P опция была удалена MacOS версии 10.8

Если у вас установлен Perl:

perl -nle 'print $1 if /console\.([a-z]+)/' file.txt | sort -u
dir
error
info
log
mark
react
time
trace
warn

Для работы со всеми файлами в каталоге:

perl -nle 'print $1 if /console\.([a-z]+)/' * | sort -u

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .