我想在“ 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
答案 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条件),则不会提及任何操作,因此默认情况下将打印该行。