grep匹配模式之后的下一个单词直到第一个空格

问题描述 投票:1回答:4

我想在“MODULE”之后得到这个词,在哪里,

  1. MODULE和“待匹配单词”之间可以有一个或多个空格。
  2. “待匹配的单词”和下一个单词之间的单个空格
  3. 待匹配的单词可以是任何模式 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/4350/4RT/6T

linux grep
4个回答
3
投票

你可以使用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,为您的输入工作。


3
投票

另一种awk方法,没有循环。

假设您的文本位于名为goku的文件中:

awk '/MODULE/{print gensub(/^.*MODULE +([^ ]+).*$/, "\\1","1")}' goku
1.2.3/4
350/4
RT/6T

2
投票

您可以使用grep:这里\K将匹配但忽略其左侧的文本,[^ ]+意味着它将匹配除白色空间之外的任何字符。 -o将打印仅匹配的文本。

grep -oP 'MODULE\s+\K[^ ]+'

1
投票

你也可以尝试一下。

awk 'sub(/.*MODULE +/,"") && sub(/ +.*/,"")' Input_file

说明:放置替换以将当前行中的字符串MODULE中的evertything更改为NULL,并再次提及sub,用于将所有内容从SPACE替换为NULL结尾。因此,如果两个替换都发生(因为AND条件存在于它们之间),则不会提及任何操作,因此默认情况下将打印该行。

© www.soinside.com 2019 - 2024. All rights reserved.