web-dev-qa-db-ja.com

macOSのGrep:正規表現でキャプチャグループの一意のオカレンスを見つける

私はmacOSを使用しており、grep(または同様のツール)を使用して、コードベース内の特定のパターンの一意のオカレンスを見つけたいと考えています。たとえば、JavaScriptですべてのconsole.somemethod()呼び出しを見つけるために、私は次のことを考案しました。

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

古い質問を再ハッシュしている場合はお詫びします!

2
Dan Burzo

正規表現で-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にサンプル行を配置しました。

Uniqの発生に制限するには:

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
2
Toto