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