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

时间:2019-03-06 16:08:55

标签: linux grep

我想在“ 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

4 个答案:

答案 0 :(得分: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,以用于给定的输入。

答案 1 :(得分:3)

另一种awk方法,无需循环。

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

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

答案 2 :(得分:2)

您可以使用notificationArr:这里grep将匹配,但忽略其左侧的文本,\K表示它将匹配除空格以外的任何字符。 [^ ]+仅打印匹配的文本。

-o

答案 3 :(得分:1)

能否请您再尝试一次。

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

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