提取 2 个不同匹配项之间的文本

提取 2 个不同匹配项之间的文本

我正在尝试提取特定的第一个匹配项之间的文本(_ 和 -)。例如,我需要从下面获取数字 5:

MQSeriesRuntime_5-U200491-7.5.0-4.x86_64

我尝试了 awk 字段分隔符(awk -F),但这让我得到了 _ 之后的整个文本。

答案1

您只需要对字段分隔符发挥创意:

$ awk 'BEGIN {FS="_|-"} {print $2}' input
5

诀窍在于FS它不是一个字符串;而是一个字符串。这是一个正则表达式。

按照您的要求更全面地解释如下:

脚本awk可以定义一个名为 的代码块BEGIN,该代码块在处理任何传入数据之前执行。

FS我使用此代码块使用正则表达式作为连字符 ( -) 或下划线 ( )来定义字段分隔符 ( ) _

下一个代码块{print $2}将会打印第二个字段(即由之前的分隔符 分隔的第二个字符串/-|_/),这就是5您要查找的字段。没有前缀的代码块将为 读取的每条记录执行awk

答案2

通过使用-F参数,可以实现稍短的解决方案。

$ awk -F'-|_' '{print $2}' input
5

答案3

sed替代方法:

sed 's/^[^_-]*_\([^_-]*\)-.*/\1/' file
5

答案4

灵感来自https://stackoverflow.com/a/2957781/53897:

echo MQSeriesRuntime_5-U200491-7.5.0-4.x86_64 | perl -n -e '/_([^-]+)/ && print $1'

相关内容