Grep no macOS: encontre ocorrências únicas de um grupo de captura na expressão regular

2

Estou no macOS e gostaria de usar grep (ou uma ferramenta semelhante) para encontrar ocorrências únicas de um determinado padrão em uma base de código. Por exemplo, para encontrar todas as chamadas console.somemethod() no JavaScript que eu criei:

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

Mas isso me traz resultados no formulário:

./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(

Gostaria de restringi-lo a correspondências exclusivas do grupo ([a-z]+) somente :

info
sendTo
error
log
markTimeline
reactStackEnd
timeEnd
trace
warn

Desculpas se estou refazendo uma pergunta antiga!

    
por Dan Burzo 06.09.2018 / 11:51

1 resposta

2

Use a opção -P para o perl regex com a diretiva \K no regex que excluirá a parte da string anterior correspondente ao resultado:

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

Eu coloquei suas linhas de exemplo no arquivo.txt para testar.

Para restringir a ocorrência uniq:

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

Outra solução -P foi removida da versão do macOS 10.8

Se você tiver o perl instalado:

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

Para trabalhar com todos os arquivos no diretório:

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