我正在尝试使用 sed 从一个字符串中提取子字符串,其中子字符串被其他字符串包围。
以下是示例字符串:
Test: 1000 calls, 15307 milliseconds, 11 minimum, 37 maximum, 15 average, top five [37,35,34,32,31]
并且我想要提取“平均”值(在上面的例子中,那就是15
。
我尝试过:
echo "Test: 1000 calls, 15307 milliseconds, 11 minimum, 37 maximum, 15 average, top five [37,35,34,32,31]" | sed 's/.*\(maximum,.*\)average/\1/'
但我得到的输出是:
maximum, 15 , top five [37,35,34,32,31]
我怎样才能不包括“15”前面的“最大值”,也不包括“15”后面的字符串部分?
编辑:抱歉,我搞错了并使用了错误的例子 - 我稍后会改正它 :(!
编辑2:我已经更正了这个例子。
sed
不是提取子字符串的最佳工具,但在这种情况下,可以使用它:即在平均值之前将所有内容与一个数字匹配,记住这个数字,然后用这个数字替换所有内容。
您还可以这样做
grep
:或者使用 Perl:
输出:
这里,GNU
grep
使用以下选项::-P
使用 Perl 正则表达式。-o
:仅打印匹配项(每行 1 个匹配项),而不是整行。\K
: 使正则表达式引擎“保留”之前匹配的所有内容\K
,而不将其包含在匹配中。具体来说,在打印匹配时忽略正则表达式的前面部分。\s+
: 1 个或多个空格字符。\S+
: 1 个或多个非空格字符。Perl 单行命令使用这些命令行标志::
-e
告诉 Perl 在行内查找代码,而不是在文件中。-n
:一次循环输入一行,$_
默认将其分配给。-l
:在行内执行代码之前删除输入行分隔符("\n"
默认在 *NIX 上),并在打印时附加它。(\S+)
:使用括号捕获1个或多个非空白字符放入变量中$1
。参见:
perldoc perlrun
:如何执行 Perl 解释器:命令行开关