我正在尝试提取特定的第一个匹配项之间的文本(_ 和 -)。例如,我需要从下面获取数字 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'