我正在尝试获取“MODULE”之后的单词,其中,
MODULE与“待匹配词”之间可以有一个或多个空格。
“待匹配词”和它的下一个词之间的单个空格
待匹配词可以是任何模式
HAL_POINT ITERATION IMPLEMENTED VERSION MODULE 1.2.3/4 OLKI 9FEB17 3MAR2018 3.2.6 CHK_PONT VALUES IMPLEMENTED VERSION MODULE 350/4 OLKI 9FEB17 3APR2018 3.2.6 HAL_POINT ITERATION JIO_PO POINT MODULE RT/6T OLKI 9FEB17 3MAR2018 3
我试过了
echo $variable | grep -oP '(?<=MODULE\s)\d.\d.\d\/\d'
和
echo $variable | grep -oP '(?<=MODULE\s\s)\d.\d.\d\/\d'
对于第一行,但我希望它更优雅和通用。
要匹配的词是 1.2.3/4
或 350/4
或 RT/6T
最佳答案
如果您非常确定单词是否由空格分隔,则可以使用 awk
,因为默认情况下 awk
在输入行中用白色分隔字段 -空格字符。对于给定的输入,您只需要
awk '{ for( i=1; i<=NF ;i++ ) if ( $i == "MODULE" ) { print $(i+1); break } }'
for
循环一直运行到 NF
,这基本上意味着运行到当前行中被空白字符分隔的最后一行条目。
如果您仍然坚持使用 grep
,您可以通过以下操作改进正则表达式。在 PCRE 中,您可以使用 ?
通过执行 (\s+)?
来匹配可变数量的空白字符,并且只获取没有空白的部分。
grep -oP '(?<=MODULE)(\s+)?\K([^ ]*)'
参见 Regular Expression from regex101为您给定的输入工作。
关于awk - grep 匹配模式后的下一个单词,直到第一个空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55027495/