Grep 模式和下一个单词

Grep 模式和下一个单词

我有一个文本文件,其中包含这样的行(只有最后两个字符串很重要):

1 sometext Pattern
2 sometext Pattern  5Asda5}  
3 sometext Pattern asd2-asd  
4 sometext Pattern a-d
5 sometext Pattern   foobar  
6 sometext Pattern {asd  
7 Pattern Pattern something 123asd  
8 Pattern sometext asd    
9 Pattern 5h{1,2}b

我需要找到以“Pattern”作为最后一个词的每一行。在这种情况下,单词被定义为带有字母和连字符的字符串。字符串后面可以有前导空格或空格(例如:Pattern\t\t\t\t\t$)

我对此的看法是

egrep  '(\bPattern\b +[^a-zA-Z\-]{2,} *$)|(\bPattern\b *$)' file.txt 

查找所有带有 Pattern 的行,后跟空格和末尾有一个非“单词”或带有 Pattern 的行。但第一部分并没有按预期工作。我需要另一种方法来找到非单词。

你能告诉我一种 gr​​ep 第 1,2,3,6,9 行而不是其余行的方法吗?我喜欢远离 awk,因为我们在课堂上没有介绍它。

答案1

请注意\b,在grep支持它的实现中,用于单词字符(数字和下划线)和非单词字符之间的转换(反之亦然)。例如,因此\bPattern\b会匹配。foo-Pattern.bar

如果您正在寻找空白分隔的图案一句话,你不能使用\b

在这里,您似乎正在寻找一个空白分隔符Pattern,后跟零个或多个空白分隔字符串的列表,这些字符串包含除字母 和 以外的字符-,因此:

non_word='([^[:blank:]]*[^[:blank:][:alpha:]-][^[:blank:]]*)'
grep -E "(^|[[:blank:]])Pattern([[:blank:]]+$non_word)*[[:blank:]]*$"

相关内容