macOS 上的 Grep:在正则表达式中查找捕获组的唯一出现位置

macOS 上的 Grep:在正则表达式中查找捕获组的唯一出现位置

我使用的是 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

使用-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

相关内容