从命令行使用正则表达式提取数字

从命令行使用正则表达式提取数字

我正在使用一个工具来计算 javascript 文件的循环复杂度。

例子:

jsc --minimal test.js

该命令将给出以下输出。

┌─────────────────────┬─────┬────────────┬─────────────────────┐
│ File                │ LOC │ Cyclomatic │ Halstead difficulty │
├─────────────────────┼─────┼────────────┼─────────────────────┤
│ /home/shray/test.js │ 23  │ 4          │ 10                  │
└─────────────────────┴─────┴────────────┴─────────────────────┘
Cyclomatic: min 4 mean 4.0 max 4
Halstead: min 10 mean 10.0 max 10

现在我用

jsc --minimal test.js | grep "Cyclomatic:"

这给了我输出

Cyclomatic: min 4 mean 4.0 max 4

现在我有一个正则表达式,Cyclomatic:[\s]*min[\s]+([0-9]+)但我无法使用它来提取显示最小 Cylomatic 值的数字。

有什么帮助我如何在终端输出上输出最小或最大循环复杂度值?

答案1

如果您知道该行始终具有相同的格式,则可以使用简单的cut

cut -d' ' -f3

或者与awk您一起完成整个事情,包括您的第一次grep

awk '$1 == "Cyclomatic:" {print $3}'

如果线路可能发生变化,请使用sed

sed -E 's/.*( min )([0-9]+).*/\2/'

或者grep -P如果有的话:

grep -Po ' min \K[0-9]+'

或正常grep

grep -o 'min [0-9]\+'

这将返回min 4,您可以轻松过滤添加另一个grepcut

grep -o '[0-9]\+$'
# or
cut -d' ' -f2

答案2

在 Linux 中,使用后视(-P仅在 Gnu grep 中):

jsc --minimal test.js | grep -Po '(?<=Cyclomatic: min )\d+'

(这会提取后面的第一组数字"Cyclomatic: min ")。

相关内容